【问题标题】:What are these differences in two DLL file generated from the same source code从相同的源代码生成的两个 DLL 文件有什么区别
【发布时间】:2017-04-17 06:27:22
【问题描述】:

我的所有代码都受源代码控制,因此我 100% 确定源代码没有更改。但是,如果我两次构建 C# DLL,它们的内容会略有不同。通过构建,然后再次构建,我可以 100% 地重现问题。

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

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

所以我挖得更深了。

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

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

这是更改的图像,正确的文件是新文件的内容。

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

【问题讨论】:

  • 有时我的 bin/release 文件夹中有一个名为 $RANDOM_SEED$ 的文件,每次重建时该文件的内容都会更改。我没有详细介绍,但我可以想象这是两个变化之一。有人需要做一些研究。 编辑:(它的 nunit,可能对 dll 没有影响,所以忘记我的评论)stackoverflow.com/a/40382757/5962841
  • 试试像 Vedit 这样好的文本/十六进制编辑器可能是值得的。自 1989 年以来我一直在使用它。即使在这些 IDE 和智能感知时代,它也是一个可供您使用的好工具。 www.vedit.com
  • How can I tell whether two Net DLLs are the same 似乎从不同的角度解决了同样的问题。
  • @Matteo 的链接应该清除它!

标签: c# msbuild patch hexdump


【解决方案1】:

这可能与 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?

解决方案:

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

【讨论】:

  • 是的,但是多次构建应该每次都产生完全相同的二进制文件,不是吗?
  • @Mafii 不幸的是,幕后总会发生一些事情......元数据看起来像 stackoverflow.com/questions/107196/… 所以不,他们不会产生相同的二进制文件
  • @Fuzzybear 有什么方法可以忽略这些元数据字节来创建补丁? (也许我应该将其作为一个单独的问题提出)
  • @Roy T 我不知道对不起,我会尝试在构建上进行重建,如果这不起作用,那么是的,我会问如何去除元数据等......可能成为另一个允许你做你需要的编译器吗?
  • @FuzzyBear 我偶然发现了blog.paranoidcoding.com/2016/04/05/…,它说 Roslyn 有一个 /deterministic 构建参数。希望有效:D
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    • 2016-10-29
    相关资源
    最近更新 更多