.NET 8程序集版本含额外信息,如何获取纯净包版本?
获取纯净的.NET程序集版本(去除源码修订哈希后缀)
当你在Git仓库中构建.NET项目时,默认会自动将源码提交的哈希值追加到AssemblyInformationalVersion的末尾,形成版本号+哈希的格式,这就是你看到额外后缀的原因。由于你无法要求所有客户端修改项目配置,只能在代码中对获取到的版本字符串进行处理,以下是几种可靠的实现方式:
方法一:字符串分割(无额外依赖)
直接按+符号分割版本字符串,取分割后的第一部分即可。这种方式简单高效,且不需要引入任何第三方包:
using System.Reflection; using System.Linq; var entryAssembly = Assembly.GetEntryAssembly(); if (entryAssembly == null) { Console.WriteLine("无法获取入口程序集"); return; } var infoVersionAttr = entryAssembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>(); var cleanVersion = infoVersionAttr?.InformationalVersion?.Split('+').FirstOrDefault() ?? "Unknown"; Console.WriteLine(cleanVersion);
说明:
- 加入了空值判断,避免因
GetEntryAssembly返回null或属性不存在导致的空引用异常 - 如果版本字符串没有
+后缀(非Git环境构建或手动禁用了源码修订追加),Split('+').FirstOrDefault()会直接返回原版本号,不会破坏正常格式
方法二:使用NuGet版本解析(可选,需引入依赖)
如果你希望更严谨地处理符合SemVer规范的版本号,可以引入NuGet.Versioning包,通过其NuGetVersion类解析版本:
- 先在类库项目中安装NuGet包:
Install-Package NuGet.Versioning
- 编写解析代码:
using System.Reflection; using NuGet.Versioning; var entryAssembly = Assembly.GetEntryAssembly(); if (entryAssembly == null) { Console.WriteLine("无法获取入口程序集"); return; } var infoVersionAttr = entryAssembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>(); if (NuGetVersion.TryParse(infoVersionAttr?.InformationalVersion, out var nuGetVersion)) { // 获取包含预发布标签的纯净版本号(如1.2.3-alpha) var cleanVersion = $"{nuGetVersion.Major}.{nuGetVersion.Minor}.{nuGetVersion.Patch}{nuGetVersion.Release}"; Console.WriteLine(cleanVersion); } else { Console.WriteLine("版本格式解析失败"); }
说明:
- 这种方式更适合需要对版本号进行复杂操作(如比较、提取版本段)的场景
- 缺点是需要引入额外的NuGet依赖,若你的类库追求轻量,方法一更合适
内容的提问来源于stack exchange,提问作者bN_
相关产品推荐
相关产品推荐

