AssemblyMetadataAttribute可用于在.NET程序集中嵌入自定义键值对元数据,通过AssemblyInfo.cs或.csproj文件声明,运行时利用反射读取,适用于存储构建信息、环境标识等非标准属性,区别于AssemblyVersion等预定义属性,其优势在于灵活扩展程序集的自我描述能力。

AssemblyMetadataAttribute
要在.NET程序集中添加
AssemblyMetadataAttribute
AssemblyInfo.cs
.csproj
在 AssemblyInfo.cs
[assembly: ...]
using System.Reflection;
// 为程序集添加一个构建日期元数据
[assembly: AssemblyMetadata("BuildDate", "2023-10-27T10:30:00Z")]
// 也可以添加多个不同的元数据
[assembly: AssemblyMetadata("GitCommitHash", "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0")]
[assembly: AssemblyMetadata("Environment", "Production")]在 SDK 风格的 .csproj
.csproj
<PropertyGroup>
<AssemblyMetadata>
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<!-- 在这里添加AssemblyMetadata -->
<AssemblyMetadata Include="BuildDate" Value="$(BuildDateTime)" />
<AssemblyMetadata Include="BuildMachine" Value="$(ComputerName)" />
<AssemblyMetadata Include="CustomTag" Value="ImportantFeatureSetA" />
</PropertyGroup>
</Project>这里的
$(BuildDateTime)
$(ComputerName)
说白了,
AssemblyMetadataAttribute
AssemblyVersion
AssemblyCompany
AssemblyVersion
AssemblyCompany
AssemblyProduct
AssemblyVersion
AssemblyCompany
而
AssemblyMetadataAttribute
AssemblyMetadataAttribute
AssemblyDescription
既然元数据已经嵌入到程序集里了,那么在运行时要读取它,就得用到反射(Reflection)了。这就像拿着放大镜去检查程序集的内部结构。
基本步骤是:
GetCustomAttributes<T>()
T
AssemblyMetadataAttribute
Key
Value
下面是一个简单的C#代码示例,展示了如何读取这些元数据:
using System;
using System.Linq;
using System.Reflection; // 别忘了引用这个命名空间
public class AssemblyMetadataReader
{
public static void ReadMyAssemblyMetadata()
{
// 获取当前正在执行的程序集
Assembly currentAssembly = Assembly.GetExecutingAssembly();
Console.WriteLine($"正在检查程序集: {currentAssembly.FullName}");
// 获取所有 AssemblyMetadataAttribute 实例
var metadataAttributes = currentAssembly.GetCustomAttributes<AssemblyMetadataAttribute>();
if (!metadataAttributes.Any())
{
Console.WriteLine("当前程序集没有找到任何 AssemblyMetadataAttribute 元数据。");
return;
}
Console.WriteLine("\n发现以下自定义程序集元数据:");
foreach (var attr in metadataAttributes)
{
Console.WriteLine($" 键 (Key): {attr.Key}");
Console.WriteLine($" 值 (Value): {attr.Value}");
Console.WriteLine("--------------------");
}
// 如果你知道某个特定的键,也可以直接查询
var buildDateAttr = metadataAttributes.FirstOrDefault(a => a.Key == "BuildDate");
if (buildDateAttr != null)
{
Console.WriteLine($"\n特定元数据 'BuildDate': {buildDateAttr.Value}");
}
}
// 假设你有一个主方法来调用它
public static void Main(string[] args)
{
ReadMyAssemblyMetadata();
Console.ReadKey(); // 暂停控制台,方便查看输出
}
}这段代码非常直接,它会列出所有你通过
AssemblyMetadataAttribute
BuildDate
AssemblyMetadataAttribute
一个最常见的,也是我个人用得最多的场景,就是嵌入构建信息。想象一下,你的应用程序部署到生产环境后,出了个Bug,客服反馈说“某个功能不对劲”。这时候,如果你的程序集里包含了诸如:
[assembly: AssemblyMetadata("GitCommit", "abcdef123456")][assembly: AssemblyMetadata("BuildTime", "2023-10-27T10:30:00Z")][assembly: AssemblyMetadata("BuildServer", "Jenkins-Prod-01")][assembly: AssemblyMetadata("GitBranch", "feature/bugfix-123")][assembly: AssemblyMetadata("TargetEnv", "Production")]那么,当你在日志中看到某个异常或者用户报告问题时,你就能立刻通过程序集自带的这些元数据,精确地追溯到是哪个Git提交、在哪个服务器上、什么时候构建出来的这个版本。这对于快速定位问题、复现Bug,以及确保部署的正确性来说,简直是无价之宝。我曾经就靠着这个,在没有版本号信息的情况下,成功定位到一个线上Bug对应的代码版本。
其次,它也可以用于内部配置或功能标记。虽然运行时配置通常通过配置文件或环境变量来管理,但有时一些编译时就确定的、不常变动的“配置”或者“功能开关”也可以放在这里。比如,一个库可能根据不同的客户需求编译出不同的版本,每个版本包含或不包含某些功能。你可以在程序集中标记:
[assembly: AssemblyMetadata("FeatureSet", "EnterpriseEdition")][assembly: AssemblyMetadata("IsTrialVersion", "False")]再有,工具或部署流程的辅助信息。比如,一个复杂的微服务系统,你可能需要标记某个服务属于哪个部署组,或者它应该被哪个特定的部署工具处理。
[assembly: AssemblyMetadata("DeploymentGroup", "CoreServices")]总的来说,
AssemblyMetadataAttribute
以上就是.NET的AssemblyMetadataAttribute类如何添加元数据?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号