You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Standard 2.1下如何读取程序集的作者元数据?

为什么读取不到Authors元数据?解决方案看这里

问题本质

你遇到的情况很典型:AssemblyTitleAttribute、AssemblyCopyrightAttribute这些是.NET CLR原生支持的程序集属性,而Authors是NuGet包特有的元数据。当你在项目包选项卡设置Authors时,这个值默认只会被写入NuGet包的.nuspec配置文件里,不会自动嵌入到编译后的程序集元数据中,所以用Assembly.GetCustomAttribute自然找不到对应的属性类型。

两种可行的解决方法

方法1:用AssemblyMetadataAttribute把Authors嵌入程序集(推荐)

我们可以借助.NET提供的AssemblyMetadataAttribute,手动把Authors信息作为自定义元数据嵌入到程序集里,这样就能通过反射读取了,而且不依赖NuGet包文件。

第一步:修改项目配置

打开你的.csproj文件,添加以下配置,把Authors的值关联到AssemblyMetadata:

<PropertyGroup>
  <!-- 这里保持你原来的Authors配置 -->
  <Authors>你的作者名</Authors>
</PropertyGroup>

<ItemGroup>
  <!-- 把Authors值嵌入到程序集元数据 -->
  <AssemblyAttribute Include="System.Reflection.AssemblyMetadataAttribute">
    <_Parameter1>Authors</_Parameter1>
    <_Parameter2>$(Authors)</_Parameter2>
  </AssemblyAttribute>
</ItemGroup>

这样编译项目时,Authors的值就会被嵌入到程序集的自定义元数据中。

第二步:反射读取代码

现在就能通过反射获取这个元数据了,示例代码:

using System.Linq;
using System.Reflection;

var assembly = Assembly.GetExecutingAssembly();
// 获取所有自定义元数据属性
var metadataAttributes = assembly.GetCustomAttributes<AssemblyMetadataAttribute>();
// 筛选出Key为"Authors"的项
var authorsMeta = metadataAttributes.FirstOrDefault(attr => attr.Key.Equals("Authors", StringComparison.OrdinalIgnoreCase));
string? authors = authorsMeta?.Value;

方法2:直接读取.nuspec文件(仅适用于已打包的场景)

如果你的项目已经生成了NuGet包,也可以直接读取.nuspec文件里的Authors字段,但这种方法需要确保.nuspec文件存在于可访问路径:

using System.Xml.Linq;

// 替换为你的nuspec文件实际路径
var nuspecPath = "./YourProject.nuspec";
var doc = XDocument.Load(nuspecPath);
var ns = XNamespace.Get("http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd");
string? authors = doc.Descendants(ns + "Authors").FirstOrDefault()?.Value;

总结

  • 根本原因:Authors是NuGet专属元数据,默认不会嵌入程序集,所以原生反射方法找不到
  • 优先选方法1:通过AssemblyMetadataAttribute嵌入后读取,适配程序运行时的场景,不需要依赖NuGet包文件

内容的提问来源于stack exchange,提问作者nicolas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 16:19:08