C# 为什么为相同的代码和相同的.net framework版本生成的.net DLL不是二进制相同的?

C# 为什么为相同的代码和相同的.net framework版本生成的.net DLL不是二进制相同的?,c#,.net,dll,compilation,C#,.net,Dll,Compilation,我有一个C#项目,当在不同的机器上编译时,会生成二进制不相等的DLL。所以我的问题是为什么生成的DLL不同?有没有办法在不同的机器上生成完全相同的dll 编辑 这就是我要做的。有多台客户机从服务器获取一些代码片段并对其进行编译。编译完dll后,它会在客户机上反复使用。如果我可以在所有机器上生成相同的DLL,那么我可以使用加密哈希轻松地检查DLL在客户端是否被篡改 由于某些原因,代码必须在客户机上编译。因此,数字签名不是一个选项。您不能期望任何重新创建的文件的二进制文件都是相同的,更不用说程序集了

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

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

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

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

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


更新 你所做的是自找麻烦,尽管我能理解有时候这是必须的。如果我是你,我会在服务器上编译二进制文件,让客户端下载二进制文件而不是代码。最终,客户机上可能没有C#编译器

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


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

为什么需要二进制相同的库?另外,如果您能了解这两台机器的确切配置,操作系统、.NET版本、使用过的IDE或编译器,那将是一件非常好的事情。您是在启用优化的情况下编译的吗?为什么需要获得二进制等价的文件?您试图解决什么问题?可能两个项目都设置了不同的部件信息?很明显,机器的配置或编译设置在某些方面是不同的。他们有多不同。net程序集可以包含生成版本信息-这是唯一的区别吗?@Steven Jeuris:这些区别出现在文件的最开始和最末尾。此外,只有少量的字节是不同的。是的,代码签名是合适的解决方案。机器的配置是不相关的。你必须使用正确的工具来解决手头的问题。我已经更新了问题并添加了有关场景的详细信息。由于某些原因,代码必须在客户机上编译。因此,数字签名不是一个选项。我检查了它以确保,但至少对于NTFS,时间戳元数据存储在中,而不是文件中。当然,编译器仍然可以存储额外的日期,但这对我来说似乎毫无用处。是的,我真傻——我的意思是文档功能,比如媒体文件或办公室文档中的那些。我将更新我的答案…+1:我刚刚比较了一些二进制文件,注意到更新2中提到的行为。此外,在构建调试构建时,我还经历了一些进一步的变化。