如何在.NET Standard 2.0类库项目中为程序集输出文件名追加版本号
问题原因
直接在VS项目属性面板的「程序集名称」配置项中引用$(AssemblyVersion)不生效,核心是MSBuild的属性求值顺序导致的:AssemblyName属性的默认求值时机远早于AssemblyVersion的赋值时机,当你在属性面板配置$(MSBuildProjectName)$(AssemblyVersion)时,$(AssemblyVersion)还是空值,自然无法拼接出预期的文件名。
实现方案
不要直接在属性面板的输入框修改配置,直接编辑类库的.csproj项目文件实现,有两种通用方案可选:
方案1:直接在属性赋值阶段拼接(仅适用于版本号直接写在csproj中的场景)
右键项目选择「编辑项目文件」,在<Project>根节点下新增PropertyGroup节点,注意AssemblyVersion必须写在AssemblyName之前,保证求值顺序:<PropertyGroup> <!-- 替换成你实际的版本号 --> <AssemblyVersion>2.1.3.0</AssemblyVersion> <AssemblyName>$(MSBuildProjectName)$(AssemblyVersion)</AssemblyName> </PropertyGroup>这个方案的局限是:如果你的
AssemblyVersion定义在传统的Properties/AssemblyInfo.cs文件中,MSBuild在处理csproj属性阶段还没读取该文件的内容,依然拿不到版本号值。方案2:编译后重命名输出文件(全场景兼容,推荐)
不管你的版本号写在csproj还是AssemblyInfo.cs中都能正常生效,把下面的Target节点加到csproj的<Project>根节点下,和PropertyGroup、ItemGroup同级即可:<Target Name="AppendVersionToOutputFileName" AfterTargets="Build"> <!-- 重命名主dll文件 --> <Move SourceFiles="$(OutputPath)$(AssemblyName).dll" DestinationFiles="$(OutputPath)$(AssemblyName)$(AssemblyVersion).dll" Condition="Exists('$(OutputPath)$(AssemblyName).dll')" /> <!-- 不需要重命名xml注释、pdb文件的话可以删掉下面两段 --> <Move SourceFiles="$(OutputPath)$(AssemblyName).xml" DestinationFiles="$(OutputPath)$(AssemblyName)$(AssemblyVersion).xml" Condition="Exists('$(OutputPath)$(AssemblyName).xml')" /> <Move SourceFiles="$(OutputPath)$(AssemblyName).pdb" DestinationFiles="$(OutputPath)$(AssemblyName)$(AssemblyVersion).pdb" Condition="Exists('$(OutputPath)$(AssemblyName).pdb')" /> </Target>
注意事项
- 配置完成后先执行「清理解决方案」,再重新生成项目,避免旧缓存文件导致配置不生效
- 如果不需要完整四段版本号,可以用MSBuild内置的分段版本变量拼接,比如
$(VersionMajor).$(VersionMinor)就只会保留主次版本号,示例:$(MSBuildProjectName).$(VersionMajor).$(VersionMinor) - 如果解决方案里有其他项目引用这个类库,优先选方案2,方案1直接修改AssemblyName可能导致VS的项目引用路径识别异常
内容的提问来源于stack exchange,提问作者Neha
相关产品推荐
相关产品推荐

