虽然我发现this post关于检索程序集上的自定义属性,但我不确定如何向 .NET Core 1.1 中的程序集添加自定义属性。在 .NET Framework 中,我会做类似的事情:
[assembly: AdditionalLocation(@"..\ReadFromHere")]
但是我在 Visual Studio 中的 netcore1.1 项目没有 AssemblyInfo.cs。我应该在哪里声明程序集的自定义属性?我可以在 .csproj 文件中添加一些内容吗?
您始终可以创建新的
AssemblyInfo.cs
文件或任何其他 .cs
文件来执行相同的操作。
但是您也可以使用新的自动生成的程序集信息机制。您可以将其添加到您的
csproj
文件中,将 Include
属性值替换为自定义属性的类型名称:
<ItemGroup>
<AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
<_Parameter1>DasMulli.Win32.ServiceUtils.Tests</_Parameter1>
</AssemblyAttribute>
</ItemGroup>
使用.NET 5.0,您可以使用AssemblyMetadata:
<AssemblyMetadata Include="Bar" Value="Baz" />
当我将库从旧的 .net 框架移动到 .net 标准时,我遇到了这个问题,我设法通过添加曾经存在于 AssemblyInfo.cs 中的非字符串属性来解决该问题。 这是我的 .csproj 文件的片段,当运行构建时我的属性就在那里:
<ItemGroup>
<AssemblyAttribute Include="Xunit.CollectionBehavior">
<_Parameter1>Xunit.CollectionBehavior.CollectionPerAssembly</_Parameter1>
<_Parameter1_IsLiteral>true</_Parameter1_IsLiteral>
<_Parameter1_TypeName>Xunit.CollectionBehavior.CollectionPerAssembly</_Parameter1_TypeName>
</AssemblyAttribute>
</ItemGroup>
它已添加到 msbuild,如下所述:https://github.com/dotnet/msbuild/issues/2281 与 https://github.com/dotnet/msbuild/blob/main/documentation/Changelog.md#msbuild-16100 此版本。
希望有帮助!现在有了这个就好多了。
进一步扩展@Vadim 的工作。在 .Net 5.0 中,您可以使用 AssemblyMetadata 标签。
下面的例子。这是一个 .Net 7.0 Blazor 项目,用于将构建日期、Git 哈希和 Git 分支放在网页的标题中。
项目.csproj
<PropertyGroup>
<!--Determines if compiler should add the attributes to the assembly-->
<GenerateGitMetadata>True</GenerateGitMetadata>
<PropertyGroup>
<Target Name="AddGitMetadaAssemblyAttributes"
BeforeTargets="GetAssemblyAttributes"
Condition=" '$(GenerateGitMetadata)' == 'true' ">
<!--Executes the Git Commands to get the Hash and Branch-->
<Exec Command="git rev-parse --short=8 HEAD" ConsoleToMSBuild="true" StandardOutputImportance="low" IgnoreExitCode="true" Condition=" '$(CommitHash)' == '' ">
<Output TaskParameter="ConsoleOutput" PropertyName="CommitHash" />
</Exec>
<Exec Command="git rev-parse --abbrev-ref HEAD" ConsoleToMSBuild="true" StandardOutputImportance="low" IgnoreExitCode="true" Condition=" '$(CommitBranch)' == '' ">
<Output TaskParameter="ConsoleOutput" PropertyName="CommitBranch" />
</Exec>
<!--Generates the ItemGroup and all AssemblyMetadata Tags-->
<ItemGroup>
<AssemblyMetadata Include="web_BuildTimestamp" Value="$([System.DateTime]::UtcNow.ToString(yyyy-MM-ddTHH:mm:ssK))" />
<AssemblyMetadata Condition=" $(CommitHash) != '' " Include="web_CommitHash" Value="$(CommitHash)" />
<AssemblyMetadata Condition=" $(CommitBranch) != '' " Include="web_CommitBranch" Value="$(CommitBranch)" />
</ItemGroup>
</Target>
任何类现在都可以使用以下代码访问属性。
var assemblyAttributes = Assembly.GetExecutingAssembly()
.GetCustomAttributes<AssemblyMetadataAttribute>()
例如 _Host.cshtml(位于顶部)
@{
string assemblyAttributePrefix = "web_";
var assemblyAttributes = Assembly.GetExecutingAssembly().GetCustomAttributes<AssemblyMetadataAttribute>().Where(x => x.Key.StartsWith(assemblyAttributePrefix));
}
在体内
@foreach (var attr in assemblyAttributes)
{
<meta name="@attr.Key.Replace(assemblyAttributePrefix,string.Empty)" content="@attr.Value" />
}