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

时间:2011-04-14 10:32:25

标签: c# .net dll compilation

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

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

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

1 个答案:

答案 0 :(得分:4)

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

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


更新

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

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


更新2

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