我有一个build task,它可以在一些程序集上执行计算成本高昂的工作。这项工作基于IL代码,相同的代码总是产生相同的结果。
我认为缓存工作结果是一个好主意,但在实现缓存时,我注意到每次编译项目时(例如当我单击Visual Studio中的Rebuild时),生成的程序集即使源代码保持不变,也会有所不同。
其中一个差异来自MVID,即Module.ModuleVersionId。似乎还有另一个变化,但我还无法确定其性质.¹
鉴于一个简单的{{1}}程序集将始终显示程序集不同,我的其他选项是什么?
将程序集反编译为IL并修剪MVID似乎对基本任务来说太多了。
¹虽然WinMerge在二进制级别的两个完全不同的位置显示两个差异,但在比较ILSpy中的程序集时,我只能看到MVID差异。
答案 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来选择此模式。