非SDK风格.NET Framework项目如何通过MSBuild传递AssemblyCopyright
我正在处理一个包含50多个C#项目的.NET Framework解决方案,原本在GlobalAssemblyInfo.cs文件中硬编码版权信息:
[assembly: AssemblyCopyright("SOME_COPYRIGHT_2026")]
现在希望将版权字符串迁移至Azure DevOps变量,让CI构建、安装程序构建等所有场景都以该变量作为版权字符串的唯一可信来源,实现一处修改即可统一应用新版权的标准化管理。
我已更新YAML构建文件,将CompanyCopyright变量传递至MSBuild任务,确认参数传递正确,相关配置如下:
task: MSBuild@1 displayName: Build solution MySolution.sln inputs: solution: MySolution.sln msbuildArguments: /p:CompanyCopyright="$(CompanyCopyright)"
目前咨询:能否从MSBuild参数中获取CompanyCopyright值,替代GlobalAssemblyInfo.cs中硬编码的AssemblyCopyright?
注:使用的是非SDK风格的.NET Framework项目文件,尝试通过Directory.Build.props配置的方法无效,该文件内容如下:
<Project> <PropertyGroup> <AssemblyCopyright> $(CompanyCopyright) </AssemblyCopyright> </PropertyGroup> </Project>
可以实现,针对非SDK风格的.NET Framework项目,按以下步骤操作即可:
移除硬编码版权
删除或注释掉GlobalAssemblyInfo.cs中的[assembly: AssemblyCopyright(...)]行,避免和MSBuild动态生成的属性冲突。使用Directory.Build.targets动态注入属性
非SDK风格项目不会自动识别Directory.Build.props里的AssemblyCopyright属性,换用Directory.Build.targets文件(放在解决方案根目录),通过编译前的目标任务动态生成版权属性:<Project> <Target Name="InjectCopyrightAttribute" BeforeTargets="CoreCompile"> <ItemGroup> <AssemblyAttribute Include="System.Reflection.AssemblyCopyrightAttribute"> <_Parameter1>$(CompanyCopyright)</_Parameter1> </AssemblyAttribute> </ItemGroup> </Target> </Project>MSBuild会自动加载解决方案根目录下的
Directory.Build.targets,无需逐个修改项目文件。确认参数传递有效性
确保Azure DevOps中已正确设置CompanyCopyright变量,MSBuild参数里的引号保留(若版权字符串含空格或特殊字符,引号是必须的)。本地构建兼容
本地测试时,可通过命令行传递参数:msbuild MySolution.sln /p:CompanyCopyright="本地测试版权信息"也可在本地
Directory.Build.props中添加默认值,避免本地构建报错:<Project> <PropertyGroup> <CompanyCopyright Condition="'$(CompanyCopyright)' == ''">默认版权信息</CompanyCopyright> </PropertyGroup> </Project>
这样就能实现所有场景下以Azure DevOps变量作为版权信息的唯一来源,达到一处修改统一应用的效果。
内容的提问来源于stack exchange,提问作者AndreyS

