You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Roslyn自动生成的AssemblyVersion设为二进制文件的FileVersion

解决自动生成的日期时间版本号同步到FileVersion的问题

我完全懂你的困扰——用1.0.*自动生成基于日期的AssemblyVersion一切正常,但FileVersion就是没法在Windows资源管理器的「详细信息」里显示出来,手动指定版本号就没问题。其实核心问题是MSBuild对AssemblyVersion和FileVersion的通配符处理逻辑不一样,咱们可以通过调整.csproj的属性和添加简单的MSBuild目标来解决,全程不用依赖AssemblyInfo.cs。

具体修改步骤

  1. 移除原有的FileVersion硬编码,换成同步自动生成的AssemblyVersion值
  2. 关闭可能干扰的自动属性生成开关,确保版本号逻辑统一

修改后的.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 20:13:10