【问题标题】:How to append version to assembly output file name in .NET Standard 2.0 Library Project如何在 .NET Standard 2.0 库项目中将版本附加到程序集输出文件名
【发布时间】:2022-06-11 01:09:56
【问题描述】:

我正在使用 VS2022 17.2.3。

在 .NET Standard 2.0 库项目中,我希望更改输出程序集文件名。

Project -> Properties -> Assembly Name中,我看到它设置为$(MSBuildProjectName)

我想将其更改为$(MSBuildProjectName)$(AssemblyVersion),但$(AssemblyVersion) 不起作用。

我想问是否有人可以指出正确的事情。

【问题讨论】:

  • 请问您是否有机会检查以下答案?如果有效,您可以单击“✔”将其标记为答案,以将其状态更改为已回答。它还将帮助其他人解决类似的问题。

标签: c# msbuild visual-studio-2022 .net-standard-2.0


【解决方案1】:

这是由于MSBuild's Property Evaluation Order

csproj 文件中设置AssemblyVersion在设置AssemblyName 之前可以正常工作:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
    <AssemblyVersion>1.0.0.0</AssemblyVersion>
    <AssemblyName>$(MSBuildProjectName)$(AssemblyVersion)</AssemblyName>
  </PropertyGroup>
</Project>
1>CSharpScratchpad -> C:\Projects\CSharpScratchpad\bin\Debug\net6.0\CSharpScratchpad1.0.0.0.dll

在 cmets 中,您还声明要使用通配符 AssemblyVersion,例如 1.0.*。我不知道访问 MSBuild 内部生成的扩展的最终形式的好方法,所以我只能提供一个稍微难看的构建后副本,从构建的程序集中检索版本:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
    <AssemblyVersion>1.0.*</AssemblyVersion>
    <Deterministic>false</Deterministic>
  </PropertyGroup>

  <Target Name="PostBuild" AfterTargets="PostBuildEvent">
    <GetAssemblyIdentity AssemblyFiles="$(TargetPath)">
      <Output TaskParameter="Assemblies" ItemName="AssemblyIdentity"/>
    </GetAssemblyIdentity>
    <Exec Command='COPY "$(TargetPath)" "$(TargetDir)$(TargetName)%(AssemblyIdentity.Version)$(TargetExt)" /Y' />
  </Target>
</Project>

在后续评论中,您只想将 major.minor 版本附加到文件名中。您可以通过创建程序集版本的System.Version 实例,然后调用它的ToString(int fieldCount) 方法,以便它只返回前两个段来做到这一点。为了便于阅读,我已将结果存储在 MajorMinor 属性中,但如果您愿意,可以将其全部合并到一行中。这将是新的后期构建目标:

<Target Name="PostBuild" AfterTargets="PostBuildEvent">
  <GetAssemblyIdentity AssemblyFiles="$(TargetPath)">
    <Output TaskParameter="Assemblies" ItemName="AssemblyIdentity"/>
  </GetAssemblyIdentity>
  <PropertyGroup>
    <MajorMinor>$([System.Version]::new("%(AssemblyIdentity.Version)").ToString(2))</MajorMinor>
  </PropertyGroup>
  <Exec Command='COPY "$(TargetPath)" "$(TargetDir)$(TargetName)$(MajorMinor)$(TargetExt)" /Y' />
</Target>

我建议能够在几个月内向你的同事或你自己解释这一点。也许其他人知道对此有一个不那么复杂的解决方案。

【讨论】:

  • false1.0.*$(MSBuildProjectName)$(AssemblyVersion) 将 1.0.0.0 更改为 1.0.* 确实不工作。
  • @Neha 请不要使用“不起作用”一词,因为它无助于识别您的问题。也就是说,我尝试了您的设置,您的问题显然是 MSBuild 没有扩展 AssemblyVersion 并尝试在程序集文件名中使用 * 通配符。在 MSBuild 应用其内部逻辑之后,我不知道如何扩展 AssemblyVersion,但我提供了一个相当丑陋的构建后重命名“解决方案”。
  • PostBuild 理念有效。它给出这样的输出:Library1.0.8195.31489.dll
  • 虽然我对输出结果很满意,但我想知道我是否只能使用 AssemblyIdentity.Version 中的 Major 和 Minor。我尝试输入 AssemblyIdentity.Version.Major 但它将 dll 文件复制为 Library(AssemblyIdentity.Version.Major).dll。
  • @Neha 我添加了一种方法来做到这一点。如果你喜欢的话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-31
  • 1970-01-01
相关资源
最近更新 更多