如何按名称获取对基类方法的 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 生成后者呢?
正如您所猜测的,您需要获得模块范围内的正确 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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)