BaseType的Mono.Cecil模块不正确

时间:2011-07-26 15:24:54

标签: c# mono.cecil

我使用AssembliyDefinition.ReadAssembly

加载两个程序集

在AssemblyA中,我定义了ClassA。

在AssemblyB中,我定义了ClassB:ClassA。

当我检查ClassB的TypeDefinition.BaseType时,我得到它的Module是AssemblyB。

我希望它的模块是AssemblyA,因为ClassB的基类型是ClassA,它在AssemblyA中定义。

这对我来说是一个错误,因为当我尝试做classB.BaseType.Resolve()时,我得到一个错误,这可能发生,因为它在错误的程序集中搜索ClassA。

任何想法?

由于

1 个答案:

答案 0 :(得分:8)

您的期望不正确。

Cecil与System.Reflection不同,对于模块,它区分了此模块中定义的类型:TypeDefinition和另一个模块中定义的类型:TypeReference。

这就是BaseType是TypeReference实例的原因,在您的情况下,对ClassA的引用在AssemblyB中。如果要查看定义BaseType的位置,而不是使用它的位置,则必须使用TypeReference的Scope属性。

如果Resolve中有错误,那就完全不同了。但是你没有显示这个错误是什么,所以我们必须猜测程序集解析器不知道在哪里寻找AssemblyA。根据你的评论,就是这样。这是你可以做的:

var resolver = new DefaultAssemblyResolver ();
resolver.AddSearchDirectory ("path/to/AssemblyA");
resolver.AddSearchDirectory ("path/to/AssemblyB");

var a = AssemblyDefinition.ReadAssembly (
    "path/to/AssemblyA/AssemblyA.dll",
    new ReaderParameters { AssemblyResolver = resolver });

var b = AssemblyDefinition.ReadAssembly (
    "path/to/AssemblyB/AssemblyB.dll",
    new ReaderParameters { AssemblyResolver = resolver });

这样,您可以确保所有程序集共享一个公共解析程序,该解析程序知道在哪里可以找到程序集。 Resolve工作得很好。