为什么在没有代码更改的情况下进行干净构建后会生成不同的dll文件?

18

当我进行C#项目的清理构建时,生成的dll与之前构建的(我单独保存的)不同。没有进行任何代码更改,仅仅是清理和重建。

Diff 显示 DLL 中的一些字节发生了改变——在文件开头和结尾附近都有几个改动,但我无法弄清这些改变代表什么。是否有人知道为什么会发生这种情况以及如何防止它发生?

我的环境是 Visual Studio 2005 / WinForms。

更新:没有使用自动版本增量或对程序集进行签名。如果这是某种时间戳,那么怎样才能阻止VS将其写入?

更新:在查看 Ildasm/diff 后,似乎以下部分不同:

  • 文件开头的 PE header 中的两个字节。
  • <PrivateImplementationDetails>{guid} 部分
  • 字符串表中含义难懂的部分,靠近文件末尾(不知道为什么,我没有更改这些字符串)
  • 文件末尾的程序集信息的一部分。

我不知道如何消除其中的任何一个部分,如果有可能的话...

3个回答

14

我最好的猜测是你看到的变更字节是在构建时自动生成的内部元数据列。

一些 Ecma-335 第 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!

11

我认为这应该是PE32规范中的IMAGE_FILE_HEADER头部的TimeDateStamp字段。


1
“..如何防止VS写入它?”我不确定是否可以告诉链接器不要在PE 32头中写入TimeDateStamp字段。解决方法是编写一个实用程序,在VS的后生成事件中清除TimeDateStamp字段。 - Magnus Johansson
2
我还想知道如何防止这被包含在内。然后我们只能发送自上一个版本以来发生更改的程序集。 - Philip Fourie

-1

可能是构建或修订号已更改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接