如何确定装配体实际发生了变化?

时间:2015-09-17 18:34:26

标签: diff .net-assembly il

我有一个build task,它可以在一些程序集上执行计算成本高昂的工作。这项工作基于IL代码,相同的代码总是产生相同的结果。

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

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

鉴于一个简单的{{1}}程序集将始终显示程序集不同,我的其他选项是什么?

将程序集反编译为IL并修剪MVID似乎对基本任务来说太多了。

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

1 个答案:

答案 0 :(得分: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来选择此模式。