.NET程序集差异/比较工具-有哪些可用的?

26
我想能够对比两个程序集的代码差异,目前找到的最接近的工具是Reflector的Diff插件,但是比较整个程序集需要手动进行,并且需要逐个浏览每个命名空间/类/方法。

我目前找到的其他工具似乎只能限于API级别(命名空间、类、方法)的差异,不能满足我的需求。

请问是否有这样的工具?我的要求按照优先级排序如下:

  • 能够分析/反射同一程序集的两个版本的代码内容并报告差异
  • 接受文件夹或组装作为输入,快速比较它们(类似于WinMerge的文件夹差异)
  • 快速确定两个程序集在代码级别上是否相等(不仅仅是API)
  • 允许轻松地深入查看差异
  • 导出有关差异的报告

(就我个人而言,我喜欢用WinMerge进行文本差异比较,因此一个具有类似界面的应用程序将非常棒)

8个回答

13
该工具 NDepend 提供了许多功能来处理.NET代码差异。

搜索更改面板Search by Change专用于浏览程序集代码的差异:

enter image description here


提供了许多约束差异和演变的代码规则。它们可以作为编写自己规则或根据需要调整规则的良好起点。例如,请查看以下规则:

Types that used to be 100% covered but not anymore

// <Name>Types that used to be 100% covered but not anymore</Name>
warnif count > 0
from t in JustMyCode.Types where 
   t.IsPresentInBothBuilds() &&
   t.OlderVersion().PercentageCoverage == 100 &&
   t.PercentageCoverage < 100
let culpritMethods = t.Methods.Where(m => m.PercentageCoverage < 100)
select new {t, t.PercentageCoverage, culpritMethods }

或者也可以参考以下内容:


要开始使用 NDepend 的比较功能,请查看文档:

免责声明:我为 NDepend 工作


6

ILSpy能将程序集反编译成整洁的目录结构。对于每个程序集都进行这样的操作,然后您可以使用自己选择的diff工具查看更改了什么。


2
使用此技术与目录树差异工具(如WinMerge或Araxis Merge)结合使用已被证明非常有用。 - Cameron

5
你可以使用 ILDasm 从程序集中生成 IL 源代码。IL 源代码基本上是一个文本文件,因此您可以使用标准的文本比较工具比较两个 IL 文件。如果您使用报告的差异作为进一步查找的指示,则解释 IL 源代码可能并不必要。

5
这是一个重复的问题,与此问题相似。
如先前所述,有一个免费且开源的工具叫做BitDiffer。它很棒,可以比较整个版本构建或单个 DLL,并显示命名空间层次结构以便于查找更改内容。

非常好的工具。难以相信它到目前为止没有有用的点击。 - andreas

4

感谢您的建议;NDepend已经在我们明年的“购买清单”上了,但是他们的比较工具在试用版中不可用。您知道它是否可以进行代码级别的差异比较吗?Framework Design Studio是API级别的,我有libcheck但实际上还没有测试过--所以我现在会尝试一下 :) - STW
我之前曾经尝试过使用NDepend,但并没有深入了解。我对它印象深刻,但是对于代码层面的差异,我不太确定。 - Jason Evans

1

我已经明白了,它完全符合我的要求 - 但只适用于一次比较单个方法。我在问题的第一行提到了这个陷阱 :) - STW

0

Reflector的差异插件非常棒!我已经使用它多年了。


我也喜欢它用于单个比较,但是当你需要一个包含数百个方法的完整程序集的差异报告,或者需要针对总共数千个方法的几百个程序集进行比较时,它就不太适用了 :-D - STW

0

我制作了一个专门用于比较程序集的小工具。我有两个几乎相同的程序集,除了方法中的IL略有不同外,其中一个还散布着一些NOPs。它们的C#代码几乎完全相同,但是IL显然非常不同。我尝试使用ILDasm并将生成的输出与TortoiseMerge / WinDiff进行比较,但是由于有太多的虚假差异而毫无用处。 NOPs确实影响了结果,因为它会更改分支地址,从而在每个方法的每行上产生差异。

所以,我构建了一个名为 ILDump的小工具。它采用BSD许可证。它能够修剪掉NOPs,使用“智能”标签重命名,使得通过“NOP移位”的方式已经相同的代码不会被Diff程序检测出差异,并且它还只打印重要的标签(即被跳转/切换到的标签)。它还可以对方法进行排序,以便不同方式创建的两个程序集不会被捕获为差异。

这绝对不是完美的,它不能处理除了转储每个方法的 IL 以外的任何东西,也没有希望进行往返。我创建它的原因是为了使阅读方法的IL更容易(它的智能标签使跟踪分支显着容易),这样我就可以通过像TortoiseMerge或WinDiff这样的程序运行它,并且它不会在每行代码上说有差异。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接