程序集加载和解析
本文档介绍如何加载外部程序集、解析类型和管理程序集依赖关系。
📋 文档信息
| 属性 | 值 |
|---|---|
| 难度 | 高级 |
| 阅读时间 | 30 分钟 |
| 前置知识 | 编译创建、元数据引用 |
| 相关文档 | 元数据引用管理、符号查找 |
🎯 学习目标
- ✅ 从文件和字节数组加载程序集
- ✅ 解析程序集中的类型
- ✅ 获取程序集信息和依赖关系
- ✅ 分析程序集内容
加载外部程序集
从文件加载
csharp
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
public IAssemblySymbol LoadAssemblyFromFile(
CSharpCompilation compilation,
string assemblyPath)
{
// 创建元数据引用
var reference = MetadataReference.CreateFromFile(assemblyPath);
// 添加引用到编译
var newCompilation = compilation.AddReferences(reference);
// 获取程序集符号
var assemblySymbol = newCompilation.GetAssemblyOrModuleSymbol(reference)
as IAssemblySymbol;
return assemblySymbol;
}从字节数组加载
csharp
public IAssemblySymbol LoadAssemblyFromBytes(
CSharpCompilation compilation,
byte[] assemblyBytes)
{
// 从字节数组创建引用
var reference = MetadataReference.CreateFromImage(assemblyBytes);
// 添加引用到编译
var newCompilation = compilation.AddReferences(reference);
// 获取程序集符号
return newCompilation.GetAssemblyOrModuleSymbol(reference) as IAssemblySymbol;
}解析类型
查找类型
csharp
public INamedTypeSymbol FindTypeInAssembly(
IAssemblySymbol assembly,
string typeName)
{
return FindTypeInNamespace(assembly.GlobalNamespace, typeName);
}
private INamedTypeSymbol FindTypeInNamespace(
INamespaceSymbol namespaceSymbol,
string typeName)
{
// 在当前命名空间中查找
var type = namespaceSymbol.GetTypeMembers(typeName).FirstOrDefault();
if (type != null)
{
return type;
}
// 在子命名空间中递归查找
foreach (var childNamespace in namespaceSymbol.GetNamespaceMembers())
{
type = FindTypeInNamespace(childNamespace, typeName);
if (type != null)
{
return type;
}
}
return null;
}程序集信息
获取基本信息
csharp
public class AssemblyInfo
{
public string Name { get; set; }
public string Version { get; set; }
public string Culture { get; set; }
public string PublicKeyToken { get; set; }
}
public AssemblyInfo GetAssemblyInfo(IAssemblySymbol assembly)
{
return new AssemblyInfo
{
Name = assembly.Name,
Version = assembly.Identity.Version.ToString(),
Culture = assembly.Identity.CultureName,
PublicKeyToken = BitConverter.ToString(
assembly.Identity.PublicKeyToken.ToArray()).Replace("-", "")
};
}关键要点
- ✅ 使用
MetadataReference.CreateFromFile加载程序集 - ✅ 使用
GetAssemblyOrModuleSymbol获取程序集符号 - ✅ 递归遍历命名空间查找类型
- ✅ 使用
IAssemblySymbol.Identity获取程序集信息
相关文档
最后更新: 2026-02-06