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

时间:2011-02-04 15:31:13

标签: inheritance assemblies cil il mono.cecil

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

我试过

type.BaseType.Resolve().Methods;

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

添加一个电话
MSILWorker.Create(OpCodes.Call, baseMethod);

(通过从解析的TypeDefinition中预先分析方法找到baseMethod) 产生的IL是不可读的,甚至Reflector冻结并退出。

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

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

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

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

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

1 个答案:

答案 0 :(得分: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);