使用Mono.Cecil查找类型层次结构程序集

时间:2011-01-22 17:26:47

标签: c# reflection assemblies mono.cecil

我正在尝试实现一个接收类型的方法,并返回包含其基类型的所有程序集。

例如:
A 是基类型(类 A 属于程序集 c:\ A.dll
B 继承自 A (类 B 属于程序集 c:\ B.DLL
C 继承自 B (类 C 属于程序集 c:\ c.dll

public IEnumerable<string> GetAssembliesFromInheritance(string assembly, 
                                                        string type)
{
    // If the method recieves type C from assembly c:\C.dll
    // it should return { "c:\A.dll", "c:\B.dll", "c:\C.dll" }
}

我的主要问题是来自Mono.Cecil的AssemblyDefinition不包含任何属性,例如 Location

如果找到 AssemblyDefinition

,如何找到装配位置?

1 个答案:

答案 0 :(得分:3)

程序集可以由多个模块组成,因此它本身并没有真正的位置。程序集的主模块确实有一个位置:

AssemblyDefinition assembly = ...;
ModuleDefinition module = assembly.MainModule;
string fileName = module.FullyQualifiedName;

所以你可以写下以下内容:

public IEnumerable<string> GetAssembliesFromInheritance (TypeDefinition type)
{
    while (type != null) {
        yield return type.Module.FullyQualifiedName;

        if (type.BaseType == null)
            yield break;

        type = type.BaseType.Resolve ();
    }
}

或任何其他令您满意的变体。