Introducing JustAssembly: A Lightweight .NET Assembly Diff Tool

On behalf of the engineering team, I'm incredibly excited to announce a new tool we've built for .NET developers called JustAssembly!

JustAssembly is a free and open source .NET assembly diff and analysis tool. With it, you can quickly decompile .NET assemblies and perform binary code diffs against them, all within a single interface.

What's It For?

A tool like JustAssembly is useful in situations you'll likely encounter when building and shipping software. For example, JustAssembly enables you to evaluate all changes made to binaries before shipping them to customers. This lets you to check if anything was unexpectedly introduced by a hidden build step or a last-minute change. You can also get an snapshot of the changes made in a new version of a library before they're applied, giving you the opportunity to spot potential breaking changes.

Not only is JustAssembly useful, it's also incredibly powerful. You can compare assemblies on both the type metadata and the underlying IL. This means you can go beyond simply comparing changes to things like method signatures. Furthermore, it's built on top of the JustDecompile engine, which means you can compare .NET assemblies on a line-by-line basis in C# – all without needed the original source code:

After comparing the IL, JustAssembly highlights changes with different colors; additions are marked in green, modifications are marked in blue, and deletions are marked in red.

About JustDecompile

JustDecompile is our free .NET assembly browsing and decompiling tool. With it, you can browse the symbols within .NET assemblies (.dll or .exe) and decompile the assembly language to C#, Visual Basic .NET, or IL. It's an essential tool for developers wanting to understand an assembly's internals and it offers a range of features like advanced code search, dependency loading, and custom assembly lists.

Last year, we published the JustDecompile decompilation engine source code to GitHub. We did this to support developers who were looking to contribute, build plugins, or simply gain a better understanding of how JustDecompile works behind the scenes. If you're looking for a good introduction to the API, check out Michael Crump's article on the JustDecompile engine.

Building JustAssembly from Source

JustAssembly was originally built to be used as an internal tool for our engineering teams. As it evolved over time, we realized that a tool like this would be extremely valuable to the developer community. That's why we decided to make JustAssembly available on GitHub under the Apache License, Version 2.0:

JustAssembly uses JustDecompileEngine (also available on GitHub) as a submodule. Make sure to pass the --recursive option when cloning the repo, otherwise, you'll have to initialize your local configuration file with the command, git submodule init. Afterward, use git submodule update to fetch JustDecompileEngine and check out the appropriate commit.

The source code is structured as follows:

  • Binaries: contains binary dependencies for JustAssembly
  • Core: contains C# implementation of the Difference Algorithm (Eugene Myers), difference items, and item comparers (basically, the guts of JustAssembly)
  • JustDecompileEngine: contains the submodule for JustDecompileEngine
  • Tests/JustAssembly.Tests: unit tests for the difference algorithm implementation
  • Tools: contains internal classes used to loading the marketing banner and wire-up an analytics service (if required)
  • UI: contains the C# source files and XAML used to create the JustAssembly UI

The repository has one solution file, JustAssembly.sln, which contains the source files for JustAssembly. This can be built using Visual Studio.

Next Steps

Please take a couple of minutes to download and install JustAssembly. Let us know what you think. Is it useful? Where can we improve it? What features would you like to see in the next release? If you're looking to get more involved, star/watch the JustAssembly repo on GitHub. Or, go one step further and submit an issue or pull request! We're keen to see your contributions to this utility.

Comments