gpt4 book ai didi

inheritance - Mono.Cecil:从其他程序集调用基类的方法

转载 作者:行者123 更新时间:2023-12-04 03:17:34 34 4
gpt4 key购买 nike

如何通过名称获取基类方法的 MethodReference?

我试过了

type.BaseType.Resolve().Methods;

如果我将包含基类的 dll 添加到 assemblyresolver,它会返回方法。但是如果我使用

添加一个调用
MSILWorker.Create(OpCodes.Call, baseMethod);

(其中 baseMethod 是通过从已解析的 TypeDefinition 中寻找方法找到的)生成的 IL 是不可读的,甚至 Reflector 也会卡住并退出。

现在一些 IL:
如果在类型上调用私有(private)方法:

 call instance void SomeNamespace.MyClass::RaisePropertyChanged(string)

如果在基类型上调用 protected 方法:

call instance void [OtherAssembly]BaseNamespace.BaseClass::RaisePropertyChanged(string)

那么,我如何使用 Mono.Cecil 生成后者?

最佳答案

正如您所猜到的,您需要为模块获取适当的 MethodReference 范围。所以如果你有:

TypeDefinition type = ...;
TypeDefintion baseType = type.BaseType.Resolve ();
MethodDefinition baseMethod = baseType.Methods.First (m => ...);

然后 baseType 和 baseMethod 是来自另一个模块的定义。在使用它之前,您需要导入对 baseMethod 的引用:

MethodReference baseMethodReference = type.Module.Import (baseMethod);
il.Emit (OpCodes.Call, baseMethodReference);

关于inheritance - Mono.Cecil:从其他程序集调用基类的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4899710/

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