【问题标题】:.NET Assembly Diff / Compare Tool - What's available? [closed].NET 程序集差异/比较工具 - 有什么可用的? [关闭]
【发布时间】:2010-11-19 19:08:13
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: .net assemblies diff


    【解决方案1】:

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

    面板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 比较功能,请查看文档:

    免责声明:我为 NDepend 工作

    【讨论】:

      【解决方案2】:

      ILSpy 可以将程序集反编译成整洁的目录结构。对每个程序集执行此操作,您可以使用您选择的差异工具来查看发生了什么变化。

      【讨论】:

      • 将此技术与 WinMerge 或 Araxis Merge 等目录树差异工具一起使用已证明非常有用
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        正如另一个中提到的,有一个名为BitDiffer 的免费开源工具。太棒了,它可以比较整个构建或单个 DLL,并显示命名空间层次结构以轻松找到更改的内容。

        【讨论】:

        • 非常好的工具。不敢相信它到目前为止没有任何有用的点击
        【解决方案5】:

        【讨论】:

        • 感谢您的建议; NDepend 在我们明年的“购买”清单上,但他们的比较工具在试验中不可用。你知道它是否有代码级差异吗? Framework Design Studio 是 API 级别的,我有 libcheck 但还没有实际测试过——所以我现在就试一试 :)
        • 前段时间我确实搞砸了 NDepend,但从未深入过它。我对它印象深刻,但我害怕代码级差异。
        【解决方案6】:

        我相信 http://www.codeplex.com/reflectoraddins 有一个 Reflector 插件,称为 diff。你可以试试。

        【讨论】:

        • 我得到了它,它完全符合我的要求——但只适用于一次比较一个方法。我在问题的第 1 行提到了这个陷阱:)
        【解决方案7】:

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

        【讨论】:

        • 我也喜欢它用于单独比较:-D
        【解决方案8】:

        我制作了一个小工具,专门用于以某种方式比较程序集。我有两个程序集,它们基本相同,只是方法中的 IL 略有不同,其中一个程序集有一些 NOP。他们的 C# 代码几乎相同,但 IL 显然完全不同。我尝试使用 ILDasm 并将生成的输出与 TortoiseMerge/WinDiff 进行比较,但它有太多错误的差异,以至于没有用。 NOP 确实弄乱了输出,因为它更改了分支地址等,并且基本上在每种方法的每一行都产生了差异。

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

        这绝对不是完美的,它除了倾倒每个方法的IL之外什么都不处理,并且没有往返的希望。我创建它的原因是为了让读取方法的 IL 变得更容易(它的智能标签使跟踪分支变得更加容易),这样我就可以通过 TortoiseMerge 或 WinDiff 之类的程序运行它,而且并不是说每个方法都有区别一行代码。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-07
          • 1970-01-01
          • 2014-10-20
          • 2010-12-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多