将程序集版权信息作为参数传递给.NET Framework项目

编程语言 2026-07-09

我正在处理一个包含50多个C#项目的.NET Framework解决方案。我有一个GlobalAssemblyInfo.cs文件,其中AssemblyCopyright是硬编码的,大致像这样

[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,并把它作为AssemblyCopyright应用,而不是在GlobalAssemblyInfo.cs中硬编码的字符串

顺便提醒一下,我处理的是.NET Framework风格的项目文件,而不是.NET SDK风格的。因此,像我在其中添加以下内容的Directory.Build.props文件的方法似乎不起作用:

<Project>
  <PropertyGroup>
    <AssemblyCopyright>
      $(CompanyCopyright)
    </AssemblyCopyright>
  </PropertyGroup>
</Project>

解决方案

遗留风格的项目不支持 AssemblyInfo 生成,但.NET Framework项目可以是SDK风格的项目。

在SDK风格的项目中,用于版权的MSBuild属性是 Copyright(而不是 AssemblyCopyright)。请参阅“在项目文件中设置程序集属性” https://learn.microsoft.com/en-us/dotnet/standard/assembly/set-attributes-project-file。

  <PropertyGroup>
    <Copyright>$(CompanyCopyright)</Copyright>
  </PropertyGroup>

这“50多个C#项目”可以从遗留风格转换为SDK风格。如果有从.NET Framework最终迁移到.NET的计划或路线图,这将是一项带来即时收益的工作量。

否则,程序集版权的生成可以自定义编写。

为该文件创建内容,并使用 WriteLinesToFile 任务来生成包含该内容的文件。

  <PropertyGroup>
    <Copyright>$(CompanyCopyright)</Copyright>
  </PropertyGroup>

  <Target Name="..." >
    <ItemGroup>
      <CopyrightFileContent Include="// Generated Copyright File" />
      <CopyrightFileContent Include="[assembly: AssemblyCopyrightAttribute(&quot;$(CompanyCopyright)&quot;)]" />
    </ItemGroup>
    <WriteLinesToFile Lines="@(CopyrightFileContent, `$([System.Environment]::NewLine)`)" File="..." Overwrite="true" />
  </Target>

请注意,关于文件名 GlobalAssemblyInfo.csAssemblyInfo.cs 没有什么特殊之处。生成的文件可以有任意名称。重要的是属性声明中 assembly: 的作用域。

自定义MSBuild代码可以在每个项目构建时把生成的文件包含在 Compile 项中。如果增量构建很重要,生成的文件应仅在该项目对其他更新的源文件进行构建时添加。没有一个可测试的属性,因此这可能有点棘手,但我认为这在StackOverflow上已经有解答。

代码不能有 AssemblyCopyrightAttribute 的重复实例,因此GlobalAssemblyInfo.cs文件中的那一行应该删除。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章