在项目文件中设置程序集属性

可以使用 MSBuild 属性将包相关的项目属性转换为生成的代码文件中的程序集属性。 此外,可以使用 MSBuild 项将任意程序集属性添加到生成的文件中。

将包属性用作程序集属性

GenerateAssemblyInfo MSBuild 属性控制项目的 AssemblyInfo 属性生成。 当 GenerateAssemblyInfo 值为 true(默认值)时,与包相关的项目属性将转换为程序集属性。 下表列出了用于生成特性的项目属性。 还列出了可用于基于每个特性禁用该生成的属性,例如:

<PropertyGroup>
  <GenerateNeutralResourcesLanguageAttribute>false</GenerateNeutralResourcesLanguageAttribute>
</PropertyGroup>
MSBuild 属性 程序集属性 要禁用特性生成的属性
Company AssemblyCompanyAttribute GenerateAssemblyCompanyAttribute
Configuration AssemblyConfigurationAttribute GenerateAssemblyConfigurationAttribute
Copyright AssemblyCopyrightAttribute GenerateAssemblyCopyrightAttribute
Description AssemblyDescriptionAttribute GenerateAssemblyDescriptionAttribute
FileVersion AssemblyFileVersionAttribute GenerateAssemblyFileVersionAttribute
InformationalVersion AssemblyInformationalVersionAttribute GenerateAssemblyInformationalVersionAttribute
Product AssemblyProductAttribute GenerateAssemblyProductAttribute
AssemblyTitle AssemblyTitleAttribute GenerateAssemblyTitleAttribute
AssemblyVersion AssemblyVersionAttribute GenerateAssemblyVersionAttribute
NeutralLanguage NeutralResourcesLanguageAttribute GenerateNeutralResourcesLanguageAttribute

有关这些设置的说明:

  • AssemblyVersionFileVersion 默认采用 $(Version) 的值而不带后缀。 例如,如果 $(Version)1.2.3-beta.4,则值将为 1.2.3
  • InformationalVersion 默认是 $(Version) 的值。
  • 如果存在 $(SourceRevisionId) 属性,则该属性会附加到 InformationalVersion。 可以使用 IncludeSourceRevisionInInformationalVersion 禁用此行为。
  • CopyrightDescription 属性也可用于 NuGet 元数据。
  • Configuration(默认值为 Debug)由所有 MSBuild 目标共享。 可以通过 dotnet 命令的 --configuration 选项对其进行设置,例如 dotnet pack
  • 创建 NuGet 包时会使用某些属性。 有关详细信息,请参阅包属性

设置任意属性

也可以将自己的程序集属性添加到生成的文件中。 为此,请定义 <AssemblyAttribute> MSBuild 项,告知 SDK 要创建的属性类型。 这些项还应包括该属性所需的任何构造函数参数。 例如,该 System.Reflection.AssemblyMetadataAttribute 属性有一个采用两个字符串的构造函数:

  • 描述任意值的名称。
  • 要存储的值。

如果 MSBuild 中有 Date 属性,其中包含程序集创建日期,则可以使用以下 MSBuild 代码通过 AssemblyMetadataAttribute 将该日期嵌入程序集属性:

<ItemGroup>
  <!-- Include must be the fully qualified .NET type name of the Attribute to create. -->
  <AssemblyAttribute Include="System.Reflection.AssemblyMetadataAttribute">
    <!-- _Parameter1, _Parameter2, etc. correspond to the
        matching parameter of a constructor of that .NET attribute type -->
    <_Parameter1>BuildDate</_Parameter1>
    <_Parameter2>$(Date)</_Parameter2>
  </AssemblyAttribute>
</ItemGroup>

此项会告知 .NET SDK 将以下 C#(或等效 F# 或 Visual Basic)代码作为程序集级属性发出:

[assembly: System.Reflection.AssemblyMetadataAttribute("BuildDate", "01/19/2024")]

(实际日期字符串是你在生成时提供的任何字符串。)

如果特性具有除 System.String 以外的参数类型,则可使用 MSBuild WriteCodeFragment 任务支持的特定 XML 元素模式来指定参数。 请参阅 WriteCodeFragment 任务 - 生成程序集级特性

从 .NET Framework 迁移

如果将 .NET Framework 项目迁移到 .NET 6 或更高版本,则可能会遇到与程序集信息文件重复相关的错误。 这是因为 .NET Framework 项目模板会创建一个包含程序集信息属性集的代码文件。 该文件通常位于 .\Properties\AssemblyInfo.cs 或 .\Properties\AssemblyInfo.vb 。 但是,SDK 样式项目还会基于项目设置为你生成此文件。

将代码移植到 .NET 6 或更高版本时,请执行以下操作之一:

  • 通过在项目文件中将 GenerateAssemblyInfo 设置为 false 来禁用包含程序集信息特性的临时代码文件的生成。 这使你可以保留 AssemblyInfo 文件。
  • 将 AssemblyInfo 文件中的设置迁移到项目文件,然后删除 AssemblyInfo 文件