gpt4 book ai didi

c# - BaseType 的 Mono.Cecil 模块不正确

转载 作者:太空狗 更新时间:2023-10-29 22:54:35 25 4
gpt4 key购买 nike

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

在 AssemblyA 中我定义了 ClassA。

在 AssemblyB 中我定义了 ClassB : ClassA。

当我检查 ClassB 的 TypeDefinition.BaseType 时,我发现它的模块是 AssemblyB。

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

这对我来说显示为错误,因为当我尝试执行 classB.BaseType.Resolve() 时出现错误,这可能是因为它在错误的程序集中搜索 ClassA。

有什么想法吗?

谢谢

最佳答案

您的期望不正确。

与 System.Reflection 不同,对于模块,Cecil 区分了在此模块中定义的类型: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 });

通过这种方式,您可以确保所有程序集共享一个公共(public)解析器,该解析器知道在哪里可以找到您的程序集。 Resolve 会工作得很好。

关于c# - BaseType 的 Mono.Cecil 模块不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6832503/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com