我加载一个程序集,然后从中创建一个我想要创建的对象的类。从该类我检查接口( 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 ,但这也不起作用。
在这两种情况下,我都会获得异常参数的值。问题是,我还没有找到一种方法来查看异常......
问题是:
答案 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。