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

11

我正在使用Roslyn功能,从当前日期/时间生成版本号

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

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

我发现当我明确标记版本号(比如1.2.3.4)时,它可以正常工作,但是自动生成的版本号不行。

我没有使用AssemblyInfo.cs,并希望在.csproj中设置属性。

enter image description here

我正在使用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吗? - Reza Aghaei
编辑带图片的内容 - 我想要能够右键单击程序集,转到属性,在详细信息选项卡下应该能够看到与程序集版本相同的版本号。 - Rohit Sharma
2个回答

6
根据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即可,而无需设置标志。谢谢您的帮助。 - Rohit Sharma
通过阅读这个答案,我现在可以理解你的问题了。我看到了你的问题:“寻找一种通过代码读取文件版本的方法”。 - Reza Aghaei

2
在 AssemblyInfo.cs 文件中,您可以设置文件属性(在详细信息选项卡下),例如文件描述和文件版本:
[assembly: AssemblyDescription("Scratch")]
[assembly: AssemblyFileVersion("1.2.3.4")]

enter image description here

不同的AssemblyFile属性如下:
FileVersionInfo.Comments = AssemblyDescription
FileVersionInfo.CompanyName = AssemblyCompany
FileVersionInfo.FileDescription = AssemblyTitle
FileVersionInfo.FileVersion = AssemblyFileVersion
FileVersionInfo.LegalCopyright = AssemblyCopyright
FileVersionInfo.LegalTrademarks = AssemblyTrademark
FileVersionInfo.ProductName = AssemblyProduct
FileVersionInfo.ProductVersion = 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。 - Rohit Sharma
@RohitSharma 但是 .Net-Core 用于构建跨平台的 DLL,在 Linux 系统上它没有文件版本的概念,这就是为什么它不在那里的原因。 - Jeremy Thompson
我看到FileVersion适用于.net core和.net standard,是吗?https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.fileversioninfo.fileversion?view=netframework-4.8 如果我明确标记2.1.2.3,我可以在Windows资源管理器中看到文件版本,所以你说的不是真的,唯一不起作用的时候是基于日期/时间的版本号。 - Rohit Sharma
1
你说得对,感谢提供链接。请将有关数字而非日期/时间的工作点放在问题的第二行。日期/时间是否以Major.Minor.Release.Build格式设置?如果没有通配符“自动增量”,则构建尚未发生,这就失去了意义。请参阅此答案以获取不同的方法:https://dev59.com/q2Up5IYBdhLWcg3whn1z#15319582 - Jeremy Thompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接