3

如何按名称获取对基类方法的 MethodReference?

我试过了

type.BaseType.Resolve().Methods;

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

MSILWorker.Create(OpCodes.Call, baseMethod);

(其中 baseMethod 是通过从已解析的 TypeDefinition 中获取方法找到的)生成的 IL 是不可读的,即使 Reflector 冻结并退出。

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

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

如果在基类型上调用受保护的方法:

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

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

4

1 回答 1

5

如您所料,您需要为模块获取适当的 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);
于 2011-02-04T15:34:37.363 回答