如果我创建.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”包含一个带有单个静态方法的静态类,生成的可执行文件的校验和将在后续构建中更改。
为什么?
答案 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 以及如何创建它们。