我如何确定一个程序集是否真的改变了?
How do I determine that an assembly actually changed?
我有一个 build task 可以在几个程序集上执行计算量大的工作。该作品基于IL代码,相同的代码总是产生相同的结果。
我认为缓存工作结果是个好主意,但在实施缓存时,我注意到每次编译项目时(例如,当我在 Visual Studio 中单击重建时),生成的程序集是不同的,即使源代码保持不变。
其中一个差异来自MVID,即Module.ModuleVersionId。好像又发生了变化,但我还不能确定它的性质。¹
考虑到一个简单的 diff
程序集将始终显示程序集不同,我的其他选择是什么?
将程序集反编译为 IL 并修整 MVID 对于基本任务来说似乎工作量太大。
¹ 虽然 WinMerge 在二进制级别的两个完全不同的位置显示了两个差异,但在比较 ILSpy 中的程序集时我只能看到 MVID 差异。
直到最近,您还不能,至少不容易。编译 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.
来 select 此模式
我有一个 build task 可以在几个程序集上执行计算量大的工作。该作品基于IL代码,相同的代码总是产生相同的结果。
我认为缓存工作结果是个好主意,但在实施缓存时,我注意到每次编译项目时(例如,当我在 Visual Studio 中单击重建时),生成的程序集是不同的,即使源代码保持不变。
其中一个差异来自MVID,即Module.ModuleVersionId。好像又发生了变化,但我还不能确定它的性质。¹
考虑到一个简单的 diff
程序集将始终显示程序集不同,我的其他选择是什么?
将程序集反编译为 IL 并修整 MVID 对于基本任务来说似乎工作量太大。
¹ 虽然 WinMerge 在二进制级别的两个完全不同的位置显示了两个差异,但在比较 ILSpy 中的程序集时我只能看到 MVID 差异。
直到最近,您还不能,至少不容易。编译 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.