为什么为相同的代码和相同的 .net 框架版本生成的 .net dll 不是二进制相同的?

Bab*_*bar 4 .net c# dll compilation

我有一个 C# 项目,它在不同的机器上编译时会生成二进制不相等的 dll。所以我的问题是为什么生成的 dll 不同?有什么方法可以在不同的机器上生成完全相同的dll吗?

编辑 这是我想要做的。有多个客户端机器从服务器获取一些代码片段并编译它。dll 编译后,它会在客户端上一遍又一遍地使用。如果我可以在所有机器上生成相同的 DLL,那么我可以使用加密哈希轻松检查 DLL 是否在客户端没有被篡改。

由于某些原因,必须在客户端机器上编译代码。因此,数字签名不是一种选择。

Ali*_*tad 5

对于重新创建的任何文件,您不能期望二进制文件相同 - 更不用说程序集了。所有文档元数据,包括创建的数据、修改的日期都将不同。

如果需要比较,则需要对程序集进行签名(强命名),并比较公钥令牌加程序集版本。


更新

你正在做的是自找麻烦,尽管我可以理解有时必须这样做。如果我是你,我会在服务器上编译二进制文件并让客户端下载二进制文件而不是代码。归根结底,客户的机器上可能没有 C# 编译器。

为了回答你的问题,如果你坚持在客户端编译,每次编译时,创建一个本地哈希并存储在注册表、某个文件等中,然后比较该哈希。


更新 2

C# 编译器从不保证它会创建相同的二进制文件。许多东西是在编译时创建的,例如命名匿名函数、自动属性的支持值、匿名方法、内部 GUID……所有这些都将在编译时创建,而编译器使用命名约定通常以一样,不能保证