Skip to content

程序集加载和解析

本文档介绍如何加载外部程序集、解析类型和管理程序集依赖关系。


📋 文档信息

属性
难度高级
阅读时间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

基于 MIT 许可发布