【问题标题】:Compare compiled .NET assemblies?比较已编译的 .NET 程序集?
【发布时间】:2010-10-13 17:43:31
【问题描述】:

有没有什么好的程序可以用来比较编译 .NET 程序集?

例如,我有 HelloWorld.dll (1.0.0.0) 和 HelloWorld.dll (2.0.0.0),我想比较差异我该怎么做?

我知道我可以使用 .NET Reflector 并使用 Assembly Diff 插件。有没有其他好的工具可以做到这一点?

【问题讨论】:

  • 只是纯粹的二进制差异?还是公共接口的区别?
  • 如果您可以将 .NET Reflector 与 Assembly Diff 一起使用,为什么还需要其他工具?插件是否不足以满足您的需求?如果有,怎么做?
  • @strager:根据我的经验,它不起作用
  • @strager:它不允许我比较同一程序集的两个版本,至少当它们的版本相同时。

标签: c# .net vb.net debugging reverse-engineering


【解决方案1】:

Ways to Compare .NET Assemblies 建议

商业:

免费:


Beyond Compare(商业)等现有比较工具可以通过特殊配置来做到这一点。以下是 Beyond Compare 的操作方法:

  • 转到工具选项
  • 点击New..,选择“文本格式”,点击OK
  • 为其命名(例如,EXE 或 DLL),并将掩码指定为 *.exe*.dll
  • 点击标签转换并选择“外部程序(Unicode文件名)”
  • 在“正在加载”下,指定ildasm 的路径并添加 %s /OUT:%t /NOBAR(即:C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\ildasm.exe %s /OUT:%t /NOBAR
  • 确保选中禁用编辑
  • 点击保存,然后点击关闭
  • 重启BC,打开两个exe文件对比,现在应该会自动反编译成ilasm

您还可以为这种新格式添加语法突出显示。我打算将语法文件发送给他们,以便become available to share

【讨论】:

  • 请注意,Framework Design Studio 非常没用。更像是一个传授风格的书籍推销员,然后最终我们都意识到这些指导方针并不是任何事情的答案。反射器插件是唯一一个免费且良好但未开发的插件。
  • 我今天花了 20 分钟尝试使用反射器插件,但我认为它不起作用。我尝试比较 2 个在 2 个不同目录中命名相同的程序集。
  • Telerik 的 JustDecompile 可以让你这样做,但它有点手动 - 你使用“创建项目”方法为每个生成源文件(显然到不同的目录)然后使用 Beyond Compare 或 DiffMerge 之类的东西等来比较源代码。
  • @jcollum 看来您可以比较两个程序集,但它们不能“相同”,例如使用相同的命名空间等等......这使得这完全没有意义
  • 在这里查看更多关于 NDepend diff 的解释ndepend.com/docs/code-diff-in-visual-studio
【解决方案2】:

两种方式。

您可以使用经典工具进行 ILDASM 和 diff。

或者您可以使用 NDepends,这将花费该功能。

[C# 臃肿的片段..]

【讨论】:

  • +1,只需 ildasm 两个文件,然后 diff 文本输出;你不需要昂贵的工具
  • 我喜欢这样简单的解决方案。
【解决方案3】:

我只需要比较同一个 DLL 的两个修订版,它们具有相同的版本(我需要实现一个小修补程序,并将 DLL 部署到生产环境中,但我想确保没有其他更改泄露到代码中) .理想情况下,我希望 Assemby Diff 加载项向我展示差异,但它不起作用(它认为我正在将 DLL 与自身进行比较)。所以这就是我所做的:

  • 创建了两个文件夹来保存反汇编的源文件。
  • 使用 ReflectorExport 选项(从上下文菜单中)从上一步创建的文件夹中的每个 DLL 生成源文件。
  • 使用免费的DiffMerge 工具比较两个目录;这些工具向我展示了修改后的文件和不同之处。

这有点笨拙,但似乎有效。不过,我希望 Assembly Diff 插件能够正常工作。

更新:最新版本的程序集差异加载项应该解决比较同一程序集的两个版本的问题。试试看吧。

【讨论】:

  • Visual Studio自带的WindDiff也很有效。
  • 我假设您的意思是 WinDiff(一个 'd')实用程序。没关系,但是 DiffMerge 要好得多。
【解决方案4】:

NDepend 工具提供了许多功能来处理 .NET 代码差异。 免责声明:我是该工具的开发者之一

Search by Change 面板专门用于浏览程序集代码差异。请注意:

  • 您可以将菜单使用的任何代码差异工具插入 NDepend 比较源文件的旧版本和新版本
  • 如果您没有源代码,只有原始程序集,则可以选择使用 Reflector 反汇编比较新旧版本

还要注意在屏幕截图中生成了一个CQLinq code query 来浏览差异。

from m in Application.Methods 
where m.CodeWasChanged() 
select new { m, m.NbLinesOfCode }

默认情况下会提出许多其他默认差异查询和规则,让您以智能方式浏览 .NET 代码差异。

【讨论】:

  • 对于那些开源开发者和钱包很薄的人,你需要购买这个功能的专业版,它没有在试用中。
  • 对于那些开源开发者,我们总是很高兴赞助一个免费许可的公共 OSS 项目,请联系我们。此外,试用模型已经发展,您现在可以下载为期 14 天的全功能试用版(包括差异功能)
【解决方案5】:

另一个选项是来自 Microsoft 的 LibCheck

用于获取公共 API 差异的相当旧的控制台工具。如果不调试并重新定位到更新的 .net 版本,我就无法运行。但是,它给了我非常清晰的输出,我将在以后使用它。

这是一个带有屏幕截图的article

【讨论】:

    【解决方案6】:

    Java 有一个不错的:Semantic Diff Utilities

    【讨论】:

    • 有趣,但不相关
    猜你喜欢
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    相关资源
    最近更新 更多