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

本文关键字:net dll 二进制 框架 代码 为什么 版本 | 更新日期: 2023-09-27 17:50:22

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

编辑这就是我要做的。有多台客户机从服务器获取一些代码片段并对其进行编译。dll被编译后,它会在客户机上被反复使用。如果我可以在所有机器上生成相同的DLL,那么我可以很容易地检查DLL是否在客户端使用加密散列进行篡改。

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

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

您不能期望重新创建的任何文件的二进制文件都是相同的-更不用说程序集了。

所有文档元数据,包括创建的数据,修改的日期将不同。

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


<标题> 更新

你这样做是自找麻烦,虽然我能理解有时必须这样做。如果我是你,我会在服务器上编译二进制文件,让客户端下载二进制文件,而不是代码。在一天结束的时候,客户端的机器上可能没有c#编译器。

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


<标题>更新2 h1> c#编译器从不保证它将创建相同的二进制文件。许多东西都是在编译时创建的,例如命名匿名函数、自动属性的支持值、匿名方法、内部guid……所有这些都将在编译时创建,虽然编译器使用命名约定,这些名称最终通常相同,但不能保证。