如何在 .NET Core 1.1 中的程序集上使用自定义属性

问题描述 投票:0回答:4

虽然我发现this post关于检索程序集上的自定义属性,但我不确定如何向 .NET Core 1.1 中的程序集添加自定义属性。在 .NET Framework 中,我会做类似的事情:

[assembly: AdditionalLocation(@"..\ReadFromHere")]

但是我在 Visual Studio 中的 netcore1.1 项目没有 AssemblyInfo.cs。我应该在哪里声明程序集的自定义属性?我可以在 .csproj 文件中添加一些内容吗?

.net-core csproj
4个回答
39
投票

您始终可以创建新的

AssemblyInfo.cs
文件或任何其他
.cs
文件来执行相同的操作。

但是您也可以使用新的自动生成的程序集信息机制。您可以将其添加到您的

csproj
文件中,将
Include
属性值替换为自定义属性的类型名称:

<ItemGroup>
  <AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
    <_Parameter1>DasMulli.Win32.ServiceUtils.Tests</_Parameter1>
  </AssemblyAttribute>
</ItemGroup>

3
投票

使用.NET 5.0,您可以使用AssemblyMetadata

<AssemblyMetadata Include="Bar" Value="Baz" />


2
投票

当我将库从旧的 .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/2281https://github.com/dotnet/msbuild/blob/main/documentation/Changelog.md#msbuild-16100 此版本。

希望有帮助!现在有了这个就好多了。


0
投票

进一步扩展@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" />
}
© www.soinside.com 2019 - 2024. All rights reserved.