我目前找到的其他工具似乎只能限于API级别(命名空间、类、方法)的差异,不能满足我的需求。
请问是否有这样的工具?我的要求按照优先级排序如下:
- 能够分析/反射同一程序集的两个版本的代码内容并报告差异
- 接受文件夹或组装作为输入,快速比较它们(类似于WinMerge的文件夹差异)
- 快速确定两个程序集在代码级别上是否相等(不仅仅是API)
- 允许轻松地深入查看差异
- 导出有关差异的报告
(就我个人而言,我喜欢用WinMerge进行文本差异比较,因此一个具有类似界面的应用程序将非常棒)
我目前找到的其他工具似乎只能限于API级别(命名空间、类、方法)的差异,不能满足我的需求。
请问是否有这样的工具?我的要求按照优先级排序如下:
(就我个人而言,我喜欢用WinMerge进行文本差异比较,因此一个具有类似界面的应用程序将非常棒)
搜索更改面板Search by Change专用于浏览程序集代码的差异:
提供了许多约束差异和演变的代码规则。它们可以作为编写自己规则或根据需要调整规则的良好起点。例如,请查看以下规则:
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 独立 UI 的上下文中使用 NDepend 构建比较功能。
Reporting Code Diff:解释如何在报告的上下文中使用 NDepend 构建比较功能。
免责声明:我为 NDepend 工作
ILSpy能将程序集反编译成整洁的目录结构。对于每个程序集都进行这样的操作,然后您可以使用自己选择的diff工具查看更改了什么。
ILDasm
从程序集中生成 IL 源代码。IL 源代码基本上是一个文本文件,因此您可以使用标准的文本比较工具比较两个 IL 文件。如果您使用报告的差异作为进一步查找的指示,则解释 IL 源代码可能并不必要。我相信有一个叫做 diff 的 Reflector 插件可以在 http://www.codeplex.com/reflectoraddins 上找到。你可以试试看。
Reflector的差异插件非常棒!我已经使用它多年了。
我制作了一个专门用于比较程序集的小工具。我有两个几乎相同的程序集,除了方法中的IL略有不同外,其中一个还散布着一些NOPs。它们的C#代码几乎完全相同,但是IL显然非常不同。我尝试使用ILDasm并将生成的输出与TortoiseMerge / WinDiff进行比较,但是由于有太多的虚假差异而毫无用处。 NOPs确实影响了结果,因为它会更改分支地址,从而在每个方法的每行上产生差异。
所以,我构建了一个名为 ILDump的小工具。它采用BSD许可证。它能够修剪掉NOPs,使用“智能”标签重命名,使得通过“NOP移位”的方式已经相同的代码不会被Diff程序检测出差异,并且它还只打印重要的标签(即被跳转/切换到的标签)。它还可以对方法进行排序,以便不同方式创建的两个程序集不会被捕获为差异。
这绝对不是完美的,它不能处理除了转储每个方法的 IL 以外的任何东西,也没有希望进行往返。我创建它的原因是为了使阅读方法的IL更容易(它的智能标签使跟踪分支显着容易),这样我就可以通过像TortoiseMerge或WinDiff这样的程序运行它,并且它不会在每行代码上说有差异。