我希望能够在两个程序集之间进行代码级差异; Reflector的Diff插件是我迄今为止发现的最接近的东西,但要比较整个程序集是一个手动过程,需要我深入到每个命名空间/类/方法。
到目前为止,我发现的其他工具似乎仅限于API级别(命名空间,类,方法)的差异 - 这些工具不会因为我正在寻找的内容而削减它。
有谁知道这样的工具?我的要求(从最高到最低)是:
(我个人喜欢WinMerge的文本差异,所以具有类似界面的应用程序会很棒)
答案 0 :(得分:13)
工具NDepend提供了许多处理.NET代码差异的功能。
面板按更改搜索专用于浏览程序集代码差异:
提出了许多约束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比较功能,请查看文档:
Advanced Code Diff from within Visual Studio:解释如何在Visual Studio和Visual NDepend独立用户界面的上下文中使用NDepend构建比较功能。
Reporting Code Diff:解释如何在报告的上下文中使用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这样的程序运行它并且不会说每个都有差异代码行。