.NET Core是否支持类似ASP.NET MVC的程序集版本自动生成与展示
.NET Core(以及后续迭代的.NET 5/6/7/8等版本)完全提供与传统ASP.NET MVC等效的自动生成构建版本、页面展示版本号的能力,仅配置和调用方式存在少量差异,具体实现如下:
传统ASP.NET MVC在AssemblyInfo.cs中标记[assembly: AssemblyVersion("1.0.*")]的逻辑,在SDK风格的.NET Core项目中需要迁移到项目文件(.csproj)中配置。
注意.NET Core默认开启确定性构建,会导致*通配符无法动态生成版本,需要先手动关闭该配置:
<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>net8.0</TargetFramework> <!-- 此处保留项目原有其他配置 --> <!-- 关闭确定性构建,允许构建时动态生成版本号 --> <Deterministic>false</Deterministic> <!-- 版本号前两位固定为主版本、次版本,后两位用*通配符自动生成 生成规则与传统ASP.NET MVC完全一致: 第三位Build号:2000年1月1日到构建当日的自然天数 第四位Revision号:构建当日0点到构建时刻的总秒数除以2 --> <AssemblyVersion>1.0.*</AssemblyVersion> <FileVersion>1.0.*</FileVersion> <Version>1.0.*</Version> </PropertyGroup> </Project>
配置完成后不需要手动在AssemblyInfo.cs中添加版本相关特性,SDK会自动生成对应程序集属性,手动添加反而会触发重复定义的编译错误。
.NET Core内置的Razor视图没有提供Html.AssemblyVersion()这个扩展方法,可以根据使用场景选以下两种实现方式:
方式一:页面内直接读取(适合简单场景)
不需要额外封装,直接在视图中通过反射读取当前程序集的版本信息即可,对应原页脚的写法如下:
<footer> <p>© @DateTime.Now.Year - @System.Reflection.Assembly.GetEntryAssembly()?.GetName().Version</p> </footer>
方式二:封装HtmlHelper扩展(和旧MVC写法完全一致)
如果想完全沿用旧项目中@Html.AssemblyVersion()的写法,自行实现一个简单的扩展方法即可:
首先新增扩展类:
using System.Reflection; using Microsoft.AspNetCore.Html; using Microsoft.AspNetCore.Mvc.Rendering; public static class HtmlHelperExtensions { public static IHtmlContent AssemblyVersion(this IHtmlHelper helper) { var version = Assembly.GetEntryAssembly()?.GetName().Version?.ToString() ?? "unknown"; return new HtmlString(version); } }
在_ViewImports.cshtml中添加该扩展类所在的命名空间引用后,就可以在所有视图中直接沿用旧写法:
<footer> <p>© @DateTime.Now.Year - @Html.AssemblyVersion()</p> </footer>
注意:如果发布时开启了单文件发布、程序集裁剪,可能出现入口程序集版本读取失败的问题,可以将获取版本的逻辑改为读取当前视图所在程序集
Assembly.GetExecutingAssembly()的版本,即可正常取值。
内容的提问来源于stack exchange,提问作者user17176542

