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

时间:2009-08-14 21:11:12

标签: .net assemblies diff

我希望能够在两个程序集之间进行代码级差异; Reflector的Diff插件是我迄今为止发现的最接近的东西,但要比较整个程序集是一个手动过程,需要我深入到每个命名空间/类/方法。

到目前为止,我发现的其他工具似乎仅限于API级别(命名空间,类,方法)的差异 - 这些工具不会因为我正在寻找的内容而削减它。

有谁知道这样的工具?我的要求(从最高到最低)是:

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

(我个人喜欢WinMerge的文本差异,所以具有类似界面的应用程序会很棒)

8 个答案:

答案 0 :(得分:13)

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

面板按更改搜索专用于浏览程序集代码差异:

enter image description here


提出了许多约束diff和evolution的代码规则。它们可以是您自己编写或根据您的需求进行调整的良好开端。例如,查看规则:

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工作

答案 1 :(得分:5)

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

答案 2 :(得分:5)

ILSpy可以将一个assmembly反编译为一个整洁的目录结构。为每个程序集执行此操作,您可以使用您选择的diff工具查看已更改的内容。

答案 3 :(得分:5)

this one来说,这是一个重复的问题。

正如另一篇文章所述,有一个免费的&amp;名为BitDiffer的开源工具。令人惊讶的是,它可以比较整个构建或单个DLL,并显示命名空间层次结构,以便轻松找到更改的内容。

答案 4 :(得分:4)

答案 5 :(得分:1)

我相信在http://www.codeplex.com/reflectoraddins有一个名为diff的反射器插件。你可以试试。

答案 6 :(得分:0)

反射器的差异插件很棒! 我已经使用它多年了。

答案 7 :(得分:0)

我专门用于以某种方式比较Assemblies的小工具。我有两个基本相同的组件,除了方法中的IL略有不同,其中一个有一些NOP遍布。 C#代码几乎完全相同,但IL显然是完全不同的。我尝试使用ILDasm并将生成的输出与TortoiseMerge / WinDiff进行比较,但是它有很多错误的区别,它没用。 NOP真的搞砸了输出,因为它改变了分支地址等,并且基本上在每个方法的每一行产生了差异。

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

它绝对不是完美的,它不会处理任何事情,而是抛弃每个方法的IL,并且没有圆形跳闸的希望。我创建它的原因是让读取方法的IL变得更容易(它的智能标记使得跟踪分支变得更加容易),因此我可以通过TortoiseMerge或WinDiff这样的程序运行它并且不会说每个都有差异代码行。