如何将Roslyn自动生成的AssemblyVersion设为二进制文件的FileVersion
解决自动生成的日期时间版本号同步到FileVersion的问题
我完全懂你的困扰——用1.0.*自动生成基于日期的AssemblyVersion一切正常,但FileVersion就是没法在Windows资源管理器的「详细信息」里显示出来,手动指定版本号就没问题。其实核心问题是MSBuild对AssemblyVersion和FileVersion的通配符处理逻辑不一样,咱们可以通过调整.csproj的属性和添加简单的MSBuild目标来解决,全程不用依赖AssemblyInfo.cs。
具体修改步骤
- 移除原有的
FileVersion硬编码,换成同步自动生成的AssemblyVersion值 - 关闭可能干扰的自动属性生成开关,确保版本号逻辑统一
修改后的.csproj关键部分如下:
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop"> <PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>netcoreapp3.1</TargetFramework> <UseWindowsForms>true</UseWindowsForms> <!-- 保留自动生成的AssemblyVersion逻辑 --> <AssemblyVersion>1.0.*</AssemblyVersion> <!-- 同步FileVersion为自动生成的AssemblyVersion --> <FileVersion>$(AssemblyVersion)</FileVersion> <Deterministic>false</Deterministic> <PackageId>Demo</PackageId> <Company>My Company</Company> <Copyright>Copyright © Xyzzy 2020</Copyright> <Description>Description</Description> <GeneratePackageOnBuild>true</GeneratePackageOnBuild> <GenerateAssemblyInfo>true</GenerateAssemblyInfo> <!-- 关闭自动生成FileVersion属性,避免冲突 --> <GenerateAssemblyFileVersionAttribute>false</GenerateAssemblyFileVersionAttribute> <!-- 其他自动生成属性保持不变 --> <GenerateAssemblyTitleAttribute>true</GenerateAssemblyTitleAttribute> <GenerateAssemblyConfigurationAttribute>true</GenerateAssemblyConfigurationAttribute> <GenerateAssemblyCompanyAttribute>true</GenerateAssemblyCompanyAttribute> <GenerateAssemblyProductAttribute>true</GenerateAssemblyProductAttribute> <GenerateAssemblyCopyrightAttribute>true</GenerateAssemblyCopyrightAttribute> <GenerateAssemblyVersionAttribute>true</GenerateAssemblyVersionAttribute> <GenerateAssemblyInformationalVersionAttribute>true</GenerateAssemblyInformationalVersionAttribute> </PropertyGroup> <!-- 添加目标确保版本号完整解析(可选,但更可靠) --> <Target Name="EnsureVersionSync" BeforeTargets="GenerateAssemblyInfo"> <PropertyGroup> <!-- 解析自动生成的AssemblyVersion为具体数字版本 --> <ResolvedAssemblyVersion>$([System.Version]::Parse('$(AssemblyVersion)'))</ResolvedAssemblyVersion> <!-- 强制FileVersion使用解析后的完整版本号 --> <FileVersion>$(ResolvedAssemblyVersion)</FileVersion> </PropertyGroup> </Target> </Project>
为什么这样能解决问题?
- 当你设置
<AssemblyVersion>1.0.*</AssemblyVersion>且<Deterministic>false</Deterministic>时,MSBuild会自动生成一个基于构建日期的具体版本号(比如1.0.20240520.1234)。 - 直接把
FileVersion设为$(AssemblyVersion)会让MSBuild复用同一个自动生成的版本号,但有些情况下通配符可能没被正确解析,添加EnsureVersionSync目标可以强制解析出完整的数字版本,确保符合Windows资源管理器的识别格式。 - 关闭
GenerateAssemblyFileVersionAttribute是为了避免MSBuild自动生成和我们指定版本冲突的属性,保证最终程序集里的FileVersion就是我们想要的自动生成版本。
验证方法
运行dotnet build构建项目后,找到输出目录下的.exe文件,右键→属性→详细信息,你就能看到FileVersion和AssemblyVersion显示相同的自动生成日期版本号了。
内容的提问来源于stack exchange,提问作者Rohit Sharma
相关产品推荐
相关产品推荐

