Set assembly attributes in a project file
You can use an MSBuild property to transform package-related project properties into assembly attributes in a generated code file. Further, you can use MSBuild items to add arbitrary assembly attributes to the generated file.
Use package properties as assembly attributes
The GenerateAssemblyInfo
MSBuild property controls AssemblyInfo
attribute generation for a project. When the GenerateAssemblyInfo
value is true
(which is the default), package-related project properties are transformed into assembly attributes. The following table lists the project properties that generate the attributes. It also lists the properties that you can use to disable that generation on a per-attribute basis, for example:
<PropertyGroup>
<GenerateNeutralResourcesLanguageAttribute>false</GenerateNeutralResourcesLanguageAttribute>
</PropertyGroup>
MSBuild property | Assembly attribute | Property to disable attribute generation |
---|---|---|
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 |
Notes about these settings:
AssemblyVersion
andFileVersion
default to the value of$(Version)
without the suffix. For example, if$(Version)
is1.2.3-beta.4
, then the value would be1.2.3
.InformationalVersion
defaults to the value of$(Version)
.- If the
$(SourceRevisionId)
property is present, it's appended toInformationalVersion
. You can disable this behavior usingIncludeSourceRevisionInInformationalVersion
. Copyright
andDescription
properties are also used for NuGet metadata.Configuration
, which defaults toDebug
, is shared with all MSBuild targets. You can set it via the--configuration
option ofdotnet
commands, for example, dotnet pack.- Some of the properties are used when creating a NuGet package. For more information, see Package properties.
Set arbitrary attributes
It's possible to add your own assembly attributes to the generated file as well. To do so, define <AssemblyAttribute>
MSBuild items that tell the SDK what type of attribute to create. These items should also include any constructor parameters that are required for that attribute. For example, the System.Reflection.AssemblyMetadataAttribute attribute has a constructor that takes two strings:
- A name to describe an arbitrary value.
- The value to store.
If you had a Date
property in MSBuild that contained the date when an assembly was created, you could use AssemblyMetadataAttribute
to embed that date into the assembly attributes using the following MSBuild code:
<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>
This item tells the .NET SDK to emit the following C# (or equivalent F# or Visual Basic) as an assembly-level attribute:
[assembly: System.Reflection.AssemblyMetadataAttribute("BuildDate", "01/19/2024")]
(The actual date string would be whatever you provided at the time of the build.)
If the attribute has parameter types other than System.String
, you can specify the parameters by using a particular pattern of XML elements supported by the MSBuild WriteCodeFragment
task. See WriteCodeFragment task - Generate assembly-level attributes.
Migrate from .NET Framework
If you migrate your .NET Framework project to .NET 6 or later, you might encounter an error related to duplicate assembly info files. That's because .NET Framework project templates create a code file with assembly info attributes set. The file is typically located at .\Properties\AssemblyInfo.cs or .\Properties\AssemblyInfo.vb. However, SDK-style projects also generate this file for you based on the project settings.
When porting your code to .NET 6 or later, do one of the following:
- Disable the generation of the temporary code file that contains the assembly info attributes by setting
GenerateAssemblyInfo
tofalse
in your project file. This enables you to keep your AssemblyInfo file. - Migrate the settings in the AssemblyInfo file to the project file, and then delete the AssemblyInfo file.