【问题标题】:How do I determine that an assembly actually changed?如何确定程序集实际发生了变化?
【发布时间】:2015-09-17 18:34:25
【问题描述】:

我有一个build task,它在一些程序集上执行计算量很大的工作。工作基于 IL 代码,相同的代码总是产生相同的结果。

我认为缓存工作结果是个好主意,但是在实现缓存时,我注意到每次编译项目时(例如,当我在 Visual Studio 中单击 Rebuild 时),生成的程序集是不同的,即使源代码保持不变。

其中一个区别来自 MVID,即Module.ModuleVersionId。似乎还有另一个变化,但我还无法确定它的性质。¹

鉴于程序集的简单diff 将始终显示程序集不同,我还有哪些其他选择?

将程序集反编译为 IL 并修剪 MVID 对于基本任务来说似乎工作量太大。


¹ 虽然 WinMerge 在二进制级别显示两个完全不同位置的两个差异,但在 ILSpy 中比较程序集时,我只能看到 MVID 差异。

【问题讨论】:

  • 程序集是一个 PE32 文件,它在标题中存储构建日期。 IMAGE_FILE_HEADER.TimeDateStamp 字段。您可以使用 Dumpbin.exe /headers 查看它

标签: diff .net-assembly il


【解决方案1】:

直到最近,您还不能,至少不容易。编译 C# 或 VB.NET(我假设这就是您正在使用的)的过程中有很多部分是不确定的。

但是对于 Roslyn 1.2 / Visual Studio 2015 Update 2,有 a new option for deterministic output。您可以通过将 /deterministic 传递给 csc/vbc 或手动将 <Deterministic>true</Deterministic> 添加到您的 csproj/vbproj 来选择此模式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    • 2018-09-11
    • 2020-11-08
    • 2020-04-10
    • 2011-03-31
    相关资源
    最近更新 更多