.NET Standard 2.1下如何读取程序集的作者元数据?
问题本质
你遇到的情况很典型: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
相关产品推荐
相关产品推荐

