1

我加载了一个程序集,并从中加载了我想要创建的对象的一个​​类。从那个类中我检查接口(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以确保我有正确的实现,然后尝试使用接口MonoObject * 引用和接口虚拟方法MonoMethod * (args = NULL) ->使用mono_runtime_invoke调用它,但这是不成功的。

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

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

问题是:

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

1 回答 1

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。

于 2014-10-09T14:01:35.830 回答