Mono.Cecil BaseType的Module不正确

本文关键字:Module 不正确 BaseType Cecil Mono | 更新日期: 2023-09-27 18:03:28

我正在使用AssembliyDefinition加载两个程序集。ReadAssembly

在AssemblyA中定义了ClassA。

在AssemblyB中我定义了ClassB: ClassA。

当我检查TypeDefinition时。我得到它的模块是AssemblyB.

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

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

有什么想法吗?

谢谢

Mono.Cecil BaseType的Module不正确

您的期望不正确。

Cecil,不像System。对于一个模块来说,反射区分了本模块中定义的类型:TypeDefinition和另一个模块中定义的类型:typerreference。

这就是为什么BaseType是一个typerreference实例的原因,在您的例子中,对ClassA的引用在AssemblyB中。如果您想查看BaseType在哪里定义,而不是在哪里使用,则必须使用typerreference的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可以正常工作