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

问题描述:

我加载一个程序集并从中创建一个对象的类。从那个类我检查接口(mono_class_get_interfaces)并找到我想要的接口类(IDispose)。如何使用Mono Embedding调用接口方法?

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

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

我也试图拨打mono_method_get_unmanaged_thunk具有相同的参数,那也不行。

在这两种情况下,我都会为异常参数获取一个值。问题是,我还没有找到一个方式来看待异常内...

的问题是:

  1. 是正确的调用与管理的接口工作,调用的顺序正确的(最具体)接口方法?
  2. 如何获得对MonoException更多的信息(我假设MonoObject *通过调用返回的是一个MonoException实例)?

无需调用任何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。

+0

这基本上听起来像我有(除了演员 - 但不应该伤害)。我会检查异常并看看它说什么。感谢名单。 – obiwanjacobi 2014-10-10 05:15:33

+1

我在上面添加了一些简单的测试代码,它在mono回购的test-invoke.c示例中正常工作。也许你正在调用的方法抛出异常? – lupus 2014-10-10 08:12:18

+0

是的。该方法抛出异常。我在Dispose impl中使用了Trace.WriteLine。并且产生了一个例外,即初始化配置系统时发生错误。我很难调用异常的ToString,但获取Message属性。我试图在mono_jit_init(_version)之前调用mono_config_parse(NULL),但这会使init退出应用程序。我认为问题在于嵌入运行时的代码不是进程而是插件,所以我可能必须以不同的方式初始化配置系统。 – obiwanjacobi 2014-10-10 15:40:14