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

时间:2014-10-08 09:07:14

标签: interface mono mono-embedding

我加载一个程序集,然后从中创建一个我想要创建的对象的类。从该类我检查接口( 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 ,但这也不起作用。

在这两种情况下,我都会获得异常参数的值。问题是,我还没有找到一种方法来查看异常......

问题是:

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

1 个答案:

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