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

Posted

技术标签:

【中文标题】如何在二进制文件中将 AssemblyVersion 标记为 FileVersion【英文标题】:How do I get AssemblyVersion stamped as FileVersion on the binary 【发布时间】:2020-06-12 08:20:19 【问题描述】:

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

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

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

我看到当我明确标记版本号(比如 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>

【问题讨论】:

您在寻找FileVersionInfo吗? 用图片编辑 - 我希望能够右键单击程序集,转到属性,在详细信息选项卡下应该能够看到与程序集版本相同的版本号 【参考方案1】:

根据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 文件进行上述更改后,我可以在文件属性窗口中看到 FileVersion

【讨论】:

使用 .csproj 方法似乎 GenerateAssemblyFileVersionAttribute 属性默认为 true。当使用 AssemblyInfo.cs 方法时,我只需要删除 AssemblyFileVersion 并且没有设置标志。感谢您的帮助 @RohitSharma 通过阅读此答案,现在我可以理解您的要求了。我读了你的问题“寻找一种通过代码读取 FileVersion 的方法”。【参考方案2】:

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

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

不同的AssemblyFile属性如下:

FileVersionInfo.Comments = AssemblyDescription FileVersionInfo.CompanyName = AssemblyCompany FileVersionInfo.FileDescription = AssemblyTitle FileVersionInfo.FileVersion = AssemblyFileVersion FileVersionInfo.LegalCopyright = AssemblyCopyright FileVersionInfo.LegalTrademarks = AssemblyTrademark FileVersionInfo.ProductName = 组装产品 FileVersionInfo.ProductVersion = AssemblyInformationalVersion

注意:

AssemblyVersion:

指定被赋予属性的程序集的版本。

AssemblyFileVersion:

指示编译器为 Win32 文件版本资源使用特定版本号。 Win32 文件版本不需要与程序集的版本号相同。

AssemblyInformationalVersion:

定义程序集清单的附加版本信息。


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

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

您可以更改文本文件中的版本,但它不会起作用,它会保留旧版本。 您可以通过在 AssemblyInfo.cs 中设置 AssemblyFileVersion 之前和之后执行 WinDiff / DiffMerge 来计算出版本号上的二进制锁是什么

【讨论】:

谢谢,但我没有使用 AssemblyInfo.cs - 这就是这个问题的重点。所有这些设置都已移至 .csproj,我想使用它而不是 AssemblyInfo.cs @RohitSharma 但 .Net-Core 用于构建跨平台 DLL,在 Linux 系统上它没有 FileVersion 的概念。这就是它不存在的原因。 Err.. 我看到 FileVersion 适用于 .net 核心和 .net 标准没有? docs.microsoft.com/en-us/dotnet/api/… 我可以看到我是否明确标记了 2.1.2.3 我可以在 Windows 资源管理器中看到文件版本,所以你说的不是真的,唯一不起作用的是基于日期/时间的版本号 你是对的,谢谢你的链接。请把关于数字作品的观点放在你问题的第二行,而不是日期/时间。日期/时间是否将其设置为 Major.Minor.Release.Build 格式?如果没有通配符“自动增量”,构建还没有发生并且失败了。请参阅此答案以了解不同的方法:***.com/a/15319582/495455

以上是关于如何在二进制文件中将 AssemblyVersion 标记为 FileVersion的主要内容,如果未能解决你的问题,请参考以下文章

如何在C中将2个二进制文件转换为short

如何在 C++/CLI 或 C# 中将静态结构数据保存到二进制文件

如何在动作脚本中将二进制内容发送到 servlet

如何在 .NET 中将自定义类型保存为二进制数据?

如何在 C++ 中将整个文件读入 std::string?

在python中将字符串保存到二进制文件