.NET 8中无需修改入口程序集属性获取包版本的方法
我开发了一个NuGet包,需要获取入口程序集的包版本。此前使用以下方法获取版本:
using System.Reflection; var version = Assembly.GetEntryAssembly() .GetCustomAttribute<AssemblyInformationalVersionAttribute>() .InformationalVersion; Console.WriteLine(version);
该方法原本能正常返回入口程序集的纯包版本,但由于.NET 8中InformationalVersion存在破坏性变更,现在会在版本后追加SourceRevisionId。例如,原本期望得到1.2.3-alpha,实际得到1.2.3-alpha+9d1761b41223159ec45d7d492e08820f706d7ad1。
我知道可以在入口程序集的csproj中添加<IncludeSourceRevisionInInformationalVersion>false</IncludeSourceRevisionInInformationalVersion>来解决,但我的包被多个客户端使用,不想让所有客户端都修改项目。我需要一种获取纯包版本的方式,请问除了截断+号后的字符串外,有没有更合适的方法?
除了截断+号后的内容,还有几种更规范的方式获取纯包版本:
1. 读取AssemblyVersion或AssemblyFileVersion属性
如果客户端项目的程序集版本与包版本对齐,可以直接读取这两个属性:
using System.Reflection; // 获取AssemblyVersion var assemblyVersion = Assembly.GetEntryAssembly()?.GetName().Version?.ToString(); // 获取AssemblyFileVersion var fileVersion = Assembly.GetEntryAssembly()? .GetCustomAttribute<AssemblyFileVersionAttribute>()?.Version;
注意:AssemblyVersion默认会自动递增修订号,需要客户端显式设置固定版本才能和包版本完全一致;AssemblyFileVersion则需要手动指定才能对齐包版本。
2. 基于SemVer规范解析版本
如果必须从InformationalVersion获取,按照SemVer规范解析是更严谨的方式,而非简单截断。可以手动实现基础解析,或者使用成熟的SemVer解析库:
// 手动解析(符合SemVer规范,忽略+后的元数据) var infoVersion = Assembly.GetEntryAssembly() .GetCustomAttribute<AssemblyInformationalVersionAttribute>() .InformationalVersion; var pureVersion = infoVersion.Split('+')[0]; // 使用SemVer库解析(更健壮,支持复杂版本格式) // 需先安装SemVer NuGet包 var semVer = new SemVer.Version(infoVersion); var pureVersion = semVer.ToString(); // 自动过滤+后的元数据部分
3. 读取引用包的版本(针对NuGet包自身版本)
如果你的需求是获取客户端项目中引用的你的NuGet包版本,而非入口程序集的版本,可以通过程序集引用信息获取:
using System.Linq; using System.Reflection; var entryAssembly = Assembly.GetEntryAssembly(); var packageVersion = entryAssembly?.GetReferencedAssemblies() .FirstOrDefault(a => a.Name == "你的NuGet包名称")? .Version?.ToString();
内容的提问来源于stack exchange,提问作者bN_

