Visual Studio项目升级至.NET 8后版本号未按配置生效问题
.NET 8项目版本配置不生效问题解决
问题背景
从.NET 6升级到.NET 8后,项目自动移除了AssemblyInfo.cs,按照.NET SDK项目的版本管理逻辑,在.csproj中配置了ApplicationRevision、ApplicationVersion、AssemblyInformationalVersion属性,但代码中调用Application.ProductVersion或通过反射获取AssemblyInformationalVersion时,始终返回默认的1.0.0;查看构建后obj目录自动生成的Project.AssemblyInfo.cs,所有版本属性也都是1.0.0.0或1.0.0。
问题原因
ApplicationVersion是ClickOnce专属属性:该属性仅用于ClickOnce部署的项目,普通WinForms/WPF等桌面应用不会用它来设置程序集版本,配置了也不会生效。- 缺少核心版本属性配置:.NET SDK项目中,控制程序集版本的核心属性是
AssemblyVersion(程序集版本)和AssemblyFileVersion(文件版本),你的.csproj中未配置这两个属性,SDK会默认生成1.0.0版本。 AssemblyInformationalVersion未正确关联:如果未显式配置Version属性,AssemblyInformationalVersion会默认继承Version的默认值1.0.0。
解决步骤
1. 修改.csproj配置,添加正确的版本属性
将以下配置添加到.csproj的<PropertyGroup>节点中,替换原有无效的版本配置:
<!-- 程序集版本:用于程序集识别和强命名,支持通配符自动递增修订号(如0.4.2.*) --> <AssemblyVersion>0.4.2.0</AssemblyVersion> <!-- 文件版本:显示在文件属性的详细信息页 --> <AssemblyFileVersion>0.4.2.0</AssemblyFileVersion> <!-- 信息版本:可包含预发布标签(如0.4.2-beta),优先作为Application.ProductVersion的返回值 --> <AssemblyInformationalVersion>0.4.2.0</AssemblyInformationalVersion>
2. 验证自动生成的AssemblyInfo
重新构建项目后,查看obj\Debug\net8.0\Project.AssemblyInfo.cs(路径根据你的项目配置调整),应该能看到对应版本的属性:
[assembly: System.Reflection.AssemblyVersionAttribute("0.4.2.0")] [assembly: System.Reflection.AssemblyFileVersionAttribute("0.4.2.0")] [assembly: System.Reflection.AssemblyInformationalVersionAttribute("0.4.2.0")]
3. 同步Visual Studio项目属性页
- 打开项目属性的「应用程序」选项卡,点击「程序集信息」按钮,配置的版本值会自动同步到对应字段。
- 如果需要让「包-常规」页面的「包版本」同步,可在
.csproj中添加<Version>0.4.2.0</Version>,$(VersionPrefix)会自动引用该值,包版本也会更新。
4. 代码中获取版本的可靠方式
using System.Reflection; using System.Diagnostics; var assembly = Assembly.GetExecutingAssembly(); // 获取程序集版本 var assemblyVersion = assembly.GetName().Version?.ToString(); // 获取文件版本 var fileVersion = FileVersionInfo.GetVersionInfo(assembly.Location).FileVersion; // 获取信息版本 var infoVersion = assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion;
额外说明
- 如果需要手动维护
AssemblyInfo.cs,可在.csproj中添加<GenerateAssemblyInfo>false</GenerateAssemblyInfo>禁用自动生成,但推荐使用SDK自动生成的方式简化版本管理。 - 版本属性优先级:显式配置的属性会覆盖默认值;
AssemblyInformationalVersion未设置时,会继承Version属性的值;Version未设置则默认使用1.0.0。
内容的提问来源于stack exchange,提问作者Steve Stover




