从同一源代码生成的两个DLL文件中有哪些差异

时间:2016-12-02 10:58:17

标签: c# msbuild patch hexdump

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

这根本不会对程序产生影响,但是这些微小的更改会抛弃用于从两个MSI文件创建补丁的MSIMSP等工具。制作补丁(对于我的产品)比它们应该大40倍。

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

所以我挖了一点。

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

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

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

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

2 个答案:

答案 0 :(得分:4)

这可能与Build和ReBuild

之间的差异有关

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

  

如果认为不需要重建项目,则不会。有可能   如果没有改变,也可以使用项目的部分构建位

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

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

<强> SOLUTION:

您需要按照here

所述执行确定性构建

答案 1 :(得分:0)

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