Compare compiled .NET assemblies?
Solution 1:
Ways to Compare .NET Assemblies suggests
Commercial:
- NDepend
Free:
- JustAssembly (only shows differences in API)
- BitDiffer (same)
- Reflector Diff Add-in (which you've already discovered, but not available anymore)
Existing compare tools like Beyond Compare (commercial) can do this by special configuration. Here's how to do this for Beyond Compare:
- Go to Tools → Options
- Click New.., select "Text format", click OK
- Give it a name (say, EXE, or DLL), and specify the mask as
*.exe
or*.dll
- Click on tab Conversion and select "External program (Unicode filenames)"
- Under "Loading", specify the path to
ildasm
and add%s /OUT:%t /NOBAR
(i.e.:C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\ildasm.exe %s /OUT:%t /NOBAR
) - Make sure to check disable editing.
- Click Save, then Close
- Restart BC and open two
exe
files to compare, it should decompile intoilasm
automatically now.
You can also add syntax highlighting to this new format. I plan to send the syntax file to them so that it'll become available to share.
Solution 2:
Two ways.
You could ILDASM and diff with classic tools.
Or you could use NDepends, which will cost for that feature.
[Piece to C# bloaters..]
Solution 3:
I just had to compare two revisions of the same DLL, which had the same version (I needed to implement a small hotfix, and deploy the DLL in production, but I wanted to make sure that no other changes leaked into code). Ideally, I would want the Assemby Diff add-in to show me the difference, but it does not work (it thinks that I'm comparing a DLL to itself). So this is what I did:
- Created two folders to hold disassembled source files.
- Used the Reflector's Export option (from context menu) to generate source files from each DLL in the folders created in previous step.
- Used the free DiffMerge tool to compare two directories; the tools showed me the modified files and the difference.
It's a bit kludgy, but seems to work. I wish the Assembly Diff add-in worked, though.
UPDATE: The latest version of the Assembly Diff add-in is supposed to fix the issue of comparing two versions of the same assembly. Give it a try.
Solution 4:
The tool NDepend offers many features to handle .NET code diff. Disclaimer: I am one of the developer of the tool.
The panel Search by Change is dedicated to browse assemblies code diff. Notice that:
- You can plug to NDepend any code diff tool used by the menu Compare older and newer version of source file
- If you don't have the source code, only the raw assemblies, there is the option Compare older and newer version disassembled with Reflector
Notice also in the screenshot that a CQLinq code query is generated to browse the diff.
from m in Application.Methods
where m.CodeWasChanged()
select new { m, m.NbLinesOfCode }
Many others default diff queries and rules are proposed by default, that will let you browse .NET code diff in a smart way.
- Types that used to be 100% covered but not anymore
- API Breaking Changes: Methods
- Avoid making complex methods even more complex
- Avoid decreasing code coverage by tests of types
- From now, all types added or refactored should respect basic quality principles
- Avoid transforming an immutable type into a mutable one
- Heuristic to find types moved from one namespace or assembly to another