为什么在干净的构建后没有代码更改就生成了另一个dll?

时间:2020-03-06 14:28:40  来源:igfitidea点击:

干净构建Cproject时,生成的dll与先前构建的dll不同(我分别保存了)。无需更改代码,只需清理并重建即可。

差异显示DLL中的某些字节有变化-开头附近很少,结尾附近很少,但是我无法弄清楚它们代表什么。是否有人对发生这种情况以及如何预防发生有见解?

这是使用Visual Studio 2005 / WinForms。

更新:不使用自动版本递增或者对程序集进行签名。如果是某种时间戳,如何防止VS编写它?

更新:查看Ildasm / diff后,以下各项似乎有所不同:

  • 文件开头的PE标头中有两个字节。
  • <PrivateImplementationDetails> {guid}部分
  • 字符串表的密码部分接近尾声(奇怪,为什么我没有更改字符串)
  • 文件末尾的部分组装信息。

不知道如何消除所有这些...

解决方案

可能是内部版本号或者修订版号已更改。

我认为这将是PE32规范的IMAGE_FILE_HEADER标头中的TimeDateStamp字段。

我最好的猜测是我们看到的已更改字节是在构建时自动生成的内部使用的元数据列。

某些Ecma-335 Partition II(CLI规范元数据定义)列可能会因每次构建而更改,即使源代码完全不变也是如此:

  • Module.Mvid:生成时生成的GUID。始终在变化,每次构建。
  • AssemblyRef.HashValue:如果要引用自旧版本以来也已重新生成的另一个程序集,则可以更改。

如果这确实让我们感到困扰,那么找出确切更改的最佳建议是对实际的元数据表进行比较。获得这些信息的方法是使用ildasm MetaInfo窗口:

View > MetaInfo > Raw:Header,Schema,Rows // important, otherwise you get very basic info from the next step

View > MetaInfo > Show!