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

我试过了

type.BaseType.Resolve().Methods;


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

MSILWorker.Create(OpCodes.Call, baseMethod);


(其中baseMethod是通过解析的TypeDefinition中的foreaching方法找到的)
结果产生的IL是不可读的,即使Reflector冻结并退出。

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

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


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

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);

07-24 09:30