我希望能够在两个程序集之间进行代码级差异; Reflector的Diff插件是迄今为止我发现的最接近的东西,但要比较整个程序集是一个手动过程,需要我深入到每个命名空间/类/方法.
到目前为止,我发现的其他工具似乎仅限于API级别(命名空间,类,方法)的差异 - 这些工具不会因为我正在寻找的东西而削减它.
有谁知道这样的工具?我的要求(从最高到最低)是:
(我个人喜欢WinMerge的文本差异,所以具有类似界面的应用程序会很棒)
我先给你一点背景知道我为什么问这个问题:
我目前正在一个严格监管的行业工作,因此我们的代码由官方测试机构仔细查看.这些测试机构希望能够构建代码并生成.exe或.dll,每次都完全相同(显然不会更改任何代码!).他们检查MD5和他们创建的可执行文件的SHA1以确保这一点.
到目前为止,我主要使用C++进行编码,其中(经过一些项目设置调整后)我设法让项目能够相同地重建到相同的MD5/SHA1.我现在正在一个项目中使用C#,并且在重建之后很难让MD5匹配.我知道文件的PE头中有"Time-Stamps",它们已经被清除为0.我也知道.exe有一个GUID,它再次被清除为00 00 00 ......等但是文件仍然不匹配.
我正在使用CFF资源管理器查看和编辑PE标头以删除时间和日期戳.使用二进制比较工具后,.exe中只有2个字节块不同(都非常小).
其中不一致的块的出现只是之前的一些二进制代码,这在ASCII详细介绍了路径*Project*\obj\Release\xxx.pdb文件.
编辑:现在已知这是*.pdb文件的GUID,但我仍然不知道是否可以修改它而不会导致任何错误!?
另一个块出现在看起来是函数名称的中间,即.(典型的部分)AssemblyName.GetName.Version.get_Version.System.IO.Ports.SerialPort.Parity.Byte.<PrivateImplementationDetails>{
那么不同的代码块:
4A134ACE-D6A0-461B-A47C-3A4232D90816
其次是:
"} .ValueType .__ StaticArrayInitTypeSize = 7. $$ method0x60000ab-1.RuntimeFieldHandle.InitializeArray` ...等.
任何想法或建议将是最受欢迎的!
我正在尝试生成一个足够智能的工具,以编程方式检查在不同时间在两个单独的机器上编译的相同C#代码生成的发行版本二进制文件,并得出结论,代码是相同的,同时能够获取任何代码更改(如果存在于用于生成这些二进制文件的c#代码.
我尝试过使用多种方法,但为了保持这种简短,我只会坚持最新的尝试.我在二进制文件上使用/ text选项运行ildasm并在文本中替换匿名字段等的GUID,但是当二进制文件来自不同的pc时,我发现ILDASM/text选项生成的文本被重新排序.源自相同代码但在不同机器上通过相同设置编译的二进制文件也出现严重重新排序.任何建议如何能够控制IL的重新排序将是非常感激的?
干杯
PS:任何可靠地实现这一目标的替代策略也是最受欢迎的.