.NET程序集二进制比较:忽略版本与时间戳,判断是否源自同一提交
判断两个.NET程序集是否源自同一代码提交的方法
这个问题我日常排查构建差异时经常碰到——版本号、时间戳这类元数据差异确实会让普通对比工具误报,但要确认是不是同一代码提交产出的,有几个实用的办法:
查嵌入的版本控制提交标识
很多团队的构建流程(比如用GitVersion、自定义MSBuild任务)会把Git提交哈希直接嵌入到程序集属性里,比如AssemblyInformationalVersion(格式通常是主版本.次版本.修订版-提交哈希),或者专门的GitCommitId自定义属性。你可以用dnSpy、ildasm这类工具查看,甚至直接用命令行:ildasm /text YourAssembly.dll | findstr /i "GitCommitId AssemblyInformationalVersion"只要两个程序集的提交哈希一致,基本就能确定是同一代码提交出来的。
对比核心IL代码(过滤元数据干扰)
版本号、时间戳都属于程序集的元数据,不会影响实际执行的IL逻辑。你可以把两个程序集导出成IL文本,再过滤掉无关差异:- 用ildasm导出IL:
ildasm /out:Assembly1.il /text Assembly1.dll ildasm /out:Assembly2.il /text Assembly2.dll - 用WinMerge、Beyond Compare这类diff工具对比两个IL文件,设置过滤规则忽略包含
AssemblyVersion、Timestamp、AssemblyFileVersion这些关键字的行。如果剩下的IL指令完全一致,说明代码逻辑完全相同,来自同一提交。
- 用ildasm导出IL:
用专门的.NET对比工具省事儿
有些工具天生就会自动忽略这些无关元数据:- dotPeek:JetBrains的免费反编译器,自带「对比程序集」功能,会直接跳过版本号、时间戳这类不影响功能的差异,只展示代码层面的不同(如果有的话)。
- ILSpy:开源反编译器,同样支持程序集对比,能手动设置忽略版本信息等元数据项。
- NDepend:更专业的.NET代码分析工具,支持深度对比,能自定义过滤各种元数据差异,适合复杂场景。
Source Link信息验证(.NET Core/.NET 5+适用)
如果你的项目启用了Source Link,构建时会把Git仓库地址、提交哈希嵌入到程序集里。可以用dotnet命令查看:dotnet sourcelink print-urls YourAssembly.dll输出里会包含提交哈希,直接对比两个程序集的哈希值即可。
内容的提问来源于stack exchange,提问作者Xeun




