有谁知道如何比较两个 .NET 程序集以确定它们是否是从“相同”源文件构建的?
我知道有一些差异实用程序可用,例如 Reflector 插件,但我对查看 GUI 中的差异不感兴趣,我只是想要一种自动方法来比较二进制文件集合以查看它们是否是从相同(或等效)的源文件。我知道多个不同的源文件可能会产生相同的 IL,并意识到该过程只会对 IL 中的差异敏感,而不是原始源。
仅比较两个程序集的字节流的主要障碍是 .NET 在程序集中包含一个名为“MVID”(模块版本标识符)的字段。对于每次编译,这似乎都有不同的值,因此如果您构建相同的代码两次,程序集将会不同。
一个相关的问题是,有谁知道如何强制每次编译的 MVID 相同?这将避免我们需要一个对 MVID 值的差异不敏感的比较过程。一致的 MVID 会更好,因为这意味着可以使用标准校验和。
这背后的背景是,在我们被允许发布到生产环境之前,第三方公司负责独立审查和签署我们的版本。这包括审查源代码。他们希望独立确认我们提供给他们的源代码与我们之前构建、测试和当前计划部署的二进制文件相匹配。我们正在寻找一种流程,允许他们从我们提供给他们的源中独立构建系统,并将校验和与我们测试过的二进制文件的校验和进行比较。
顺便提一句。请注意,我们正在使用持续集成、自动构建、源代码控制等。该问题与内部缺乏对哪些源文件进入给定构建的控制无关。问题是第三方负责验证我们提供给他们的源代码是否生成与我们已经测试并计划投入生产的相同的二进制文件。他们不应该信任我们的任何内部系统或控制,包括构建服务器或源代码控制系统。他们关心的只是获取与构建相关的源代码,自己执行构建,并验证输出是否与我们所说的正在部署的内容相匹配。
比较解决方案的运行速度并不是特别重要。
thanks
使用命令行工具从 IL 的文本表示中过滤掉 MVID 和日期时间戳并不算太痛苦。假设 file1.exe 和 file2.exe 是从相同的源构建的:
c:\temp> ildasm /all /text file1.exe |查找/v“时间日期戳:”|查找/v“MVID”> file1.txt
c:\temp> ildasm /all /text file2.exe |查找/v“时间日期戳:”|查找/v“MVID”> file2.txt
c:\temp> fc file1.txt file2.txt
比较文件 file1.txt 和 FILE2.TXT
FC:没有遇到任何差异
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)