Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.NET程序集差异/比较工具-有哪些可用工具?_.net_Assemblies_Diff - Fatal编程技术网

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

.NET程序集差异/比较工具-有哪些可用工具?,.net,assemblies,diff,.net,Assemblies,Diff,我希望能够在两个程序集之间进行代码级差异;Reflector的Diff插件是迄今为止我发现的最接近的东西,但是比较整个程序集是一个手动过程,需要我深入到每个名称空间/类/方法 到目前为止,我发现的其他工具似乎仅限于API级别的名称空间、类和方法差异,这些差异并不能满足我的需求 有人知道这样的工具吗?我从最高到最低的要求是: 能够分析/反映同一程序集的两个版本的代码内容,并报告差异 接受文件夹或程序集组作为输入;快速将它们与WinMerge的文件夹差异进行比较 快速确定两个程序集在代码级别(而不仅

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

到目前为止,我发现的其他工具似乎仅限于API级别的名称空间、类和方法差异,这些差异并不能满足我的需求

有人知道这样的工具吗?我从最高到最低的要求是:

能够分析/反映同一程序集的两个版本的代码内容,并报告差异 接受文件夹或程序集组作为输入;快速将它们与WinMerge的文件夹差异进行比较 快速确定两个程序集在代码级别(而不仅仅是API)是否等效的能力 允许轻松深入查看差异 导出有关差异的报告 就我个人而言,我喜欢WinMerge for text Diff,因此具有类似界面的应用程序将非常好

尝试以下方法:


我相信有一个名为diff的Reflector插件。你可以试试。

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

“按更改搜索”面板专用于浏览部件代码差异:

提出了许多约束差异和进化的代码规则。他们可以是一个很好的开始,写你自己的或使他们适应你的需要。例如,看看规则:

或者:

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

:说明如何在Visual Studio和Visual NDepend独立UI的上下文中使用NDepend构建比较功能

:说明如何在报告上下文中使用独立构建比较功能


免责声明:我为NDepend工作,reflector的diff addin非常棒!
我已经使用它很多年了。

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

我制作了一个小工具,专门用于以某种方式比较组件。我有两个基本相同的组件,除了方法中的IL稍有不同,还有一个有一些NOPs散布在各处。他们的C代码几乎相同,但IL显然完全不同。我尝试使用ILDasm并将生成的输出与OrtooisEmerge/WinDiff进行比较,但是它有太多错误的差异,所以没有用。NOP真的弄乱了输出,因为它改变了分支地址等等,并且基本上在每个方法的每一行上都产生了差异

所以,我建立了一个小工具叫做。它是BSD授权的。它能够使用智能标签重命名来修剪NOP,以便相同但被NOP移位的代码不会被Diff程序检测为差异,并且它也只打印出重要的标签,即分支/切换到的标签。它还可以对方法进行排序,这样以不同方式创建的两个程序集就不会被认为是不同的


它绝对不是完美的,它只处理每个方法的IL,而不处理任何事情,而且不存在往返的希望。我创建它的原因是为了让读取方法的IL easierit的智能标记使跟踪分支变得非常容易,这样我就可以通过一个程序运行它,比如OttoisEmerge或WinDiff,它不会说每行代码都有差异

可以将一个大概的文件反编译成一个整洁的目录结构。对每个程序集执行此操作,您可以使用自己选择的diff工具查看发生了哪些更改。

这是一个类似于重复问题的问题


正如在另一篇文章中提到的,有一个免费的开源工具叫做。令人惊讶的是,它可以比较整个构建或单个DLL,并显示名称空间层次结构,以便轻松找到更改的内容。

感谢您的建议;NDepend在我们明年的“购买”名单上,但是他们的比较工具在试验中不可用。您知道它是否存在代码级别差异吗?frameworkdesignstudio是API级的,我有libcheck,但还没有实际测试过它,所以我现在就来试一试:不久前我曾在NDepend上乱搞过,但从未深入研究过它。我对它印象深刻,但恐怕我不知道代码级别的差异。我已经得到了它,它完全符合我的要求,但一次只能比较一个方法。我在问题的第1行中提到了这个陷阱:我也喜欢单独比较,但当您需要一个包含数百个方法的完整程序集的差异报告,或者需要一个包含数千个方法的数百个程序集的差异报告时,它就无法扩展:-这是一个非常好的工具。真不敢相信它竟然没有有用的点击
将此技术与目录树差异化工具(如WinMerge或Araxis Merge)结合使用已证明非常有用
// <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 }