如何在二进制文件上将 AssemblyVersion 标记为 FileVersion

How do I get AssemblyVersion stamped as FileVersion on the binary

我正在使用 generating version number from current date/time 的 Roslyn 功能。

我可以看到自动生成的基于 date/time 的版本号被正确标记为 AssemblyVersion,我可以在运行时使用 API 读取它。

问题:如何获得相同的自动生成的基于日期时间的版本号标记为 file version,以便我可以在 windows 资源管理器中右键单击程序集并查看 "File Version" 在详细信息选项卡下

我看到当我明确标记版本号(比如 1.2.3.4)时它工作正常,但不是自动生成的

我没有使用 AssemblyInfo.cs 并且希望在 .csproj

中设置属性

我正在使用 dotnet cli 使用下面的 csproj 进行构建,例如:

<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <UseWindowsForms>true</UseWindowsForms>
    <AssemblyVersion>1.0.*</AssemblyVersion>
    <FileVersion>1.0.*</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>
    <GenerateAssemblyFileVersionAttribute>true</GenerateAssemblyFileVersionAttribute>
    <GenerateAssemblyTitleAttribute>true</GenerateAssemblyTitleAttribute>
    <GenerateAssemblyConfigurationAttribute>true</GenerateAssemblyConfigurationAttribute>
    <GenerateAssemblyCompanyAttribute>true</GenerateAssemblyCompanyAttribute>
    <GenerateAssemblyProductAttribute>true</GenerateAssemblyProductAttribute>
    <GenerateAssemblyCopyrightAttribute>true</GenerateAssemblyCopyrightAttribute>
    <GenerateAssemblyVersionAttribute>true</GenerateAssemblyVersionAttribute>
    <GenerateAssemblyInformationalVersionAttribute>true</GenerateAssemblyInformationalVersionAttribute>
  </PropertyGroup>
</Project>

在 AssemblyInfo.cs 文件中,您可以设置文件属性(在“详细信息”选项卡下),例如文件描述和文件版本:

[assembly: AssemblyDescription("Scratch")]
[assembly: AssemblyFileVersion("1.2.3.4")]

不同的AssemblyFile属性如下:

FileVersionInfo.Comments = 程序集描述
FileVersionInfo.CompanyName = 组装公司
FileVersionInfo.FileDescription = 程序集标题
FileVersionInfo.FileVersion = AssemblyFileVersion
FileVersionInfo.LegalCopyright = 大会版权
FileVersionInfo.LegalTrademarks = 大会商标
FileVersionInfo.ProductName = 组装产品
FileVersionInfo.ProductVersion = AssemblyInformationalVersion

注:

  • AssemblyVersion:

    Specifies the version of the assembly being attributed.

  • AssemblyFileVersion:

    Instructs a compiler to use a specific version number for the Win32 file version resource. The Win32 file version is not required to be the same as the assembly's version number.

  • AssemblyInformationalVersion:

    Defines additional version information for an assembly manifest.


另请注意,文件版本号实际上位于 DLL 文件的末尾。在文本编辑器中打开 DLL,然后滚动到最后,在倒数第二行的末尾:

cbff18129f3 NUL NUL FF SOH NUL BEL 1.0.0.0 NUL NUL SOH NUL

您可以在文本文件中更改版本,但这不起作用,它会保留旧版本。 您可以通过在 AssemblyInfo.cs

中设置 AssemblyFileVersion 之前和之后执行 WinDiff / DiffMerge 来找出版本号上的二进制锁是什么

根据 Microsoft.NET.GenerateAssemblyInfo.targets 项目,如果您未指定 FileVersion 属性 并将 GenerateAssemblyFileVersionAttribute 设置为 false,则 FileVersion 属性 值将等于 AssemblyVersion 属性.

尝试像这样修改您的 csproj 文件:

<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <UseWindowsForms>true</UseWindowsForms>

    <AssemblyVersion>1.0.*</AssemblyVersion>

    <!-- Comment or delete this line. -->
    <!-- <FileVersion>1.0.*</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>

    <!-- Set this attribute to false. -->
    <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>
</Project>

这种方法对我有用。对 csproj 文件进行上述更改后,我能够在文件属性 window.

中看到 FileVersion