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

发布于 2024-10-16 06:57:28 字数 640 浏览 8 评论 0原文

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

我已经尝试过了

type.BaseType.Resolve().Methods;

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

MSILWorker.Create(OpCodes.Call, baseMethod);

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

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

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

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

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

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

How can I get a MethodReference to a base class' method by name?

I've tried

type.BaseType.Resolve().Methods;

and if I add the dll containing the base class to the assemblyresolver it returns the methods.
But if I add a call using

MSILWorker.Create(OpCodes.Call, baseMethod);

(where baseMethod was found by foreaching Methods from the resolved TypeDefinition)
the resulting IL is unreadable, even Reflector freezes and quits.

Now some IL:
if calling private method on type:

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

if calling protected method on base type:

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

So, how can I produce the latter using Mono.Cecil?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

方觉久 2024-10-23 06:57:28

正如您所猜测的,您需要获得模块范围内的正确 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);

As you guessed, you need to get a proper MethodReference scoped for the module. So if you have:

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

Then baseType and baseMethod are definitions from another module. You need to import a reference to the baseMethod before using it:

MethodReference baseMethodReference = type.Module.Import (baseMethod);
il.Emit (OpCodes.Call, baseMethodReference);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文