从同一源代码生成的两个 DLL 文件有什么区别

What are these differences in two DLL file generated from the same source code

我所有的代码都在源代码管理之下,所以我 100% 确定源代码没有改变。但是,如果我两次构建 C# DLL,它们的内容会略有不同。我可以通过构建然后再次构建来 100% 地重现问题。

这似乎根本不会影响该程序,但是这些微小的更改会导致 MSIMSP 等用于从两个 MSI 文件创建补丁的工具失效。制作补丁(为我的产品)比应有的大 40 倍。

我已经反编译了两个DLL和它们的汇编信息,类,等等...完全一样。这些文件的大小也完全相同,但创建时间当然不同。所以我真的无法理解发生了什么变化。

所以我挖得更深了。

我使用 WinDiff 查找更改,然后在十六进制编辑器中交叉引用这些更改。 WinDiff 在第二个 'line' 和文件大约 80% 处的一行中显示了变化。

在十六进制编辑器中,我看到更改的第一个字节是字节 0x088(字节 136)。这似乎是此 'line' 上唯一更改的字节。我很难找到第二个更改,因为 WinDiff 没有告诉我更改的确切字节偏移量。

这是更改的图像,右边的文件是较新文件的内容。

是否有人熟悉 (C#) DLL 文件的构成,知道更改的字节可能意味着什么?或者更好的是如何确保 DLL 文件在重建时保持完全相同?

这可能与 Build 和 ReBuild 之间的差异有关

Difference between Build Solution, Rebuild Solution, and Clean Solution in Visual Studio?

if it doesn't think it needs to rebuild a project, it won't. It may also use partially-built bits of the project if they haven't changed

执行构建会在幕后使用元数据,因此您的 dll 可能会有所不同

Why is a different dll produced after a clean build, with no code changes?

解决方案:

您将需要按照所述执行确定性构建 here

如果您对 dll 进行了更改,那么大小将受到影响我向枚举添加了一些额外的属性,文件变得大约 3kb。 它也可能是由于解压缩导致文件看起来不同而导致的看不见的变化。