如何使用 Mono Embedding 调用接口方法?

Posted

技术标签:

【中文标题】如何使用 Mono Embedding 调用接口方法?【英文标题】:How to invoke an interface method with Mono Embedding? 【发布时间】:2014-10-08 09:07:13 【问题描述】:

我加载了一个程序集,并从中加载了我想要创建的对象的一个​​类。从那个类中,我检查接口 (mono_class_get_interfaces) 并找到我想要的接口类 (IDispose)。

我使用 mono_object_new 创建对象,然后直接调用 mono_runtime_object_init。然后我调用 mono_object_castclass_mbyref 将对象转换为接口引用。然后我用 mono_class_get_method_from_name 从接口类中检索我想调用的接口方法(Dispose)。

我调用 mono_object_get_virtual_method 以确保我有正确的实现,然后尝试使用 mono_runtime_invoke 调用它使用接口 MonoObject * 参考和接口虚方法 MonoMethod * (args = NULL) -> 这是不成功。

我也尝试使用相同的参数调用 mono_method_get_unmanaged_thunk,但这也不起作用。

在这两种情况下,我都会为异常参数返回一个值。问题是,我还没有找到查看异常内部的方法...

问题是:

    调用顺序是否正确,可以使用托管接口并调用正确(最具体的)接口方法? 如何获取有关 MonoException 的更多信息(我假设调用返回的 MonoObject * 是MonoException 实例)?

【问题讨论】:

【参考方案1】:

无需调用任何 castclass 函数来将托管引用转换为“接口引用”:值相同。

一旦你有了 IDispose MonoClass* 指针,你应该得到你想要调用的方法的 MonoMethod* 并将它传递给 mono_object_get_virtual_method()。这个函数的结果就是你应该传递给 mono_runtime_invoke() 的结果。

对于异常,您可以调用 get_Message 方法方法,或者如果您在 C# 代码中调用来处理它的任何方法。

下面的简单测试代码,str是一个MonoString*:

icloneable_class = mono_class_from_name (mono_get_corlib (), "System", "ICloneable");
iface_method = mono_class_get_method_from_name (icloneable_class, "Clone", 0);
iface_impl_method = mono_object_get_virtual_method (str, iface_method);
exc = NULL;
obj = mono_runtime_invoke (iface_impl_method, str, NULL, &exc);

方法被正确调用,exc 为 NULL。

【讨论】:

这基本上听起来像我所拥有的(演员除外——但这不应该受到伤害)。我会检查异常,看看它说了什么。谢谢。 我在上面添加了一些简单的测试代码,它在 mono repo 的 test-invoke.c 示例中可以正常工作。也许您正在调用的方法正在引发异常? 是的。该方法引发了异常。我在 Dispose impl 中使用了 Trace.WriteLine。并且产生了一个异常,即初始化配置系统时出错。我在异常上调用 ToString 时遇到了麻烦,但让 Message 属性工作。我曾尝试在 mono_jit_init(_version) 之前调用 mono_config_parse(NULL) 但这会使 init 退出应用程序。我认为问题在于嵌入运行时的代码不是进程而是插件,所以我可能不得不以不同的方式初始化配置系统..? 这可能意味着System.Configuration.dll没有安装或者无法加载或者需要调用mono_set_config_dir()到合适的值。

以上是关于如何使用 Mono Embedding 调用接口方法?的主要内容,如果未能解决你的问题,请参考以下文章

使用 mono 交叉编译 c 时跳过不兼容的库 (lmono)

Mono c# 嵌入,mono_runtime_invoke 崩溃应用

如何使用返回 Mono 的生成包装调用创建 Flux

如何保证接口的幂等性。。。。。

将 mono 与嵌入它的 c++ 应用程序捆绑在一起

如何保证微服务接口的幂等性