ILMerge在后续构建中生成不同的校验和

时间:2013-11-28 21:48:18

标签: c# .net visual-studio ilmerge

如果我创建.NET 3.5应用程序并应用以下后期构建事件:

if $(ConfigurationName) == Release
    "C:\Program Files (x86)\Microsoft\ILMerge\ILMerge.exe"
    /allowDup:DotfuscatorAttribute
    /ndebug
    /closed
    /out:"$(TargetPath)"
    "$(TargetPath)"
    "$(TargetDir)HelloWorld.dll"

其中“HelloWorld.dll”包含一个带有单个静态方法的静态类,生成的可执行文件的校验和将在后续构建中更改。

为什么?

1 个答案:

答案 0 :(得分:2)

这与CLI和PE格式密切相关。

ECMA CLI Specification 指出程序集中的每个模块(模块只是基础架构中的另一个单元 - 据我所知,对于常规C#VS项目每个程序集有一个模块,但也可以更改)包含模块版本ID元数据 MVID ,这对于每个构建都是不同的。

第II.22.30节说

  

应该为每个模块新生成Mvid,使用   ISO / IEC 11578:1996(附件A)或其他规定的算法   兼容算法。

此外,可移植可执行文件格式包含一系列标题,其中一些标题包含不同的时间戳(链接,文件创建等)。我对格式的细节知之甚少,但如果你好奇, this huge article 可能会有所帮助 - 它有点老了(19年?哇),但我想基本面格式仍然相同。

这些只是我在几分钟内发现的两件事,可能还有其他因素(我还读过构建的文件可能包含一些特定于它所构建的机器的数据),这不会影响构建.NET程序集时。

<小时/> 如果您需要一种可靠的识别装配的方法,请查看 Strong-Named Assemblies 以及如何创建它们。