如何在.NET Core启动代码(Startup.cs)中运行时获取程序集包版本?
在.NET Core Startup中获取程序集包版本的方法
嘿,这个问题我刚好有实践经验,完全可以在Startup.cs的启动流程里获取到你在.csproj中设置的<Version>字段值,给你分享几种靠谱的方法:
方法一:从Startup所在程序集直接获取
如果你的Startup类和.csproj里配置Version的是同一个项目,直接通过当前程序集的特性就能拿到值:
using System.Reflection; public class Startup { public void ConfigureServices(IServiceCollection services) { // 获取Startup所在的程序集,写法更直观 var currentAssembly = typeof(Startup).Assembly; // 读取AssemblyInformationalVersion特性(对应.csproj里的<Version>字段) var versionAttribute = currentAssembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>(); var projectVersion = versionAttribute?.InformationalVersion; // 可以在这里使用版本号,比如注入到服务中或者打印日志 Console.WriteLine($"当前项目版本:{projectVersion}"); } // 其他Startup方法... }
为什么用AssemblyInformationalVersionAttribute?
因为在.NET Core项目中,你在.csproj里设置的<Version>字段,默认会被编译为程序集的AssemblyInformationalVersion特性值,这是最直接对应你配置的版本号的方式。
方法二:获取入口程序集的版本
如果你的Startup类所在项目和程序入口(Program.cs)不是同一个项目,可以通过入口程序集来获取版本:
using System.Reflection; public class Startup { public void ConfigureServices(IServiceCollection services) { var entryAssembly = Assembly.GetEntryAssembly(); var versionAttribute = entryAssembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>(); var entryVersion = versionAttribute?.InformationalVersion; } }
额外注意事项
如果你在.csproj里额外配置了<AssemblyVersion>或<AssemblyFileVersion>字段,需要注意它们的区别:
<Version>→ 对应AssemblyInformationalVersionAttribute<AssemblyVersion>→ 对应AssemblyVersionAttribute<AssemblyFileVersion>→ 对应AssemblyFileVersionAttribute
如果你只是想拿到.csproj里的<Version>值,直接用AssemblyInformationalVersionAttribute就不会错。
内容的提问来源于stack exchange,提问作者Paul Duer




