当我干净地构建我的 C# 项目时,生成的 dll 与之前构建的不同(我单独保存)。没有进行任何代码更改,只是清理并重建。
Diff 显示 DLL 中的一些字节发生了变化——在开头和结尾附近的字节很少,但我无法弄清楚这些代表什么。有没有人知道为什么会发生这种情况以及如何预防?
这是使用 Visual Studio 2005/WinForms。
更新:不使用自动版本递增,或对程序集进行签名。如果它是某种时间戳,我如何防止 VS 写入它?
更新:在查看 Ildasm/diff 后,似乎以下项目有所不同:
- 文件开头的 PE header 中的两个字节。
{guid} 部分 - 接近末尾的字符串表的神秘部分(想知道为什么,我没有更改字符串)
- 文件末尾的部分装配信息。
不知道如何消除这些,如果可能的话......
最佳答案
我最好的猜测是您看到的更改字节是在构建时自动生成的内部使用的元数据列。
一些 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!
关于c# - 为什么在没有代码更改的干净构建后会生成不同的 dll?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/107196/