如何在二进制文件中将 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的主要内容,如果未能解决你的问题,请参考以下文章