.NET中如何排除Version以避免影响程序集SHA计算?
解决.NET构建中版本号不影响程序集SHA的问题
为啥会这样?
你用/p:Version传递动态版本号时,.NET默认会把这个值同时应用到AssemblyVersion、FileVersion和InformationalVersion三个字段中。其中AssemblyVersion是程序集的核心标识字段,会被纳入SHA计算范围,所以哪怕代码没有任何变更,只要版本号变了,程序集的SHA值就会跟着改变。
怎么解决?
核心思路是拆分版本参数:固定住影响SHA计算的AssemblyVersion,只让动态版本号填充不影响SHA的字段。
1. 直接在构建命令中拆分参数
修改Github Actions里的构建命令,分别指定三个版本字段:
dotnet build --configuration Release --no-restore --verbosity normal /p:AssemblyVersion=1.0.0.0 /p:FileVersion=${VERSION} /p:InformationalVersion=${VERSION}
- AssemblyVersion:固定为一个不变的值(比如
1.0.0.0),这个字段决定程序集的哈希值,固定后只要代码不变,SHA就不会改变。 - FileVersion:设为动态的
${VERSION},对应文件属性里的版本号,不影响哈希计算。 - InformationalVersion:设为动态的
${VERSION},可以包含版本标签、分支信息等额外内容,同样不影响哈希计算。
2. 全局配置(简化命令)
如果不想每次构建都写冗长的参数,可以在解决方案根目录创建一个Directory.Build.props文件,提前固定AssemblyVersion:
<Project> <PropertyGroup> <AssemblyVersion>1.0.0.0</AssemblyVersion> </PropertyGroup> </Project>
之后构建命令就可以简化为:
dotnet build --configuration Release --no-restore --verbosity normal /p:FileVersion=${VERSION} /p:InformationalVersion=${VERSION}
关键提醒
- 只有AssemblyVersion会影响程序集的SHA计算,必须固定它才能实现你的需求。
- FileVersion和InformationalVersion仅作为附加元数据存在,修改它们不会改变程序集的哈希值,完全可以使用动态版本号。
内容的提问来源于stack exchange,提问作者user246392
相关产品推荐
相关产品推荐

