Interface 如何使用Mono嵌入调用接口方法?

Interface 如何使用Mono嵌入调用接口方法?,interface,mono,mono-embedding,Interface,Mono,Mono Embedding,我加载一个程序集并从中创建一个对象类。从该类中,我检查接口(mono_class\u get_interfaces),并找到我想要的接口类(IDispose) 我使用mono\u object\u new创建对象,然后直接调用mono\u runtime\u object\u init。然后调用mono\u object\u castclass\u mbyref将对象强制转换为接口引用。然后我用mono\u class\u get\u method\u from\u name从接口类中检索我想要

我加载一个程序集并从中创建一个对象类。从该类中,我检查接口(mono_class\u get_interfaces),并找到我想要的接口类(IDispose)

我使用mono\u object\u new创建对象,然后直接调用mono\u runtime\u object\u init。然后调用mono\u object\u castclass\u mbyref将对象强制转换为接口引用。然后我用mono\u class\u get\u method\u from\u name从接口类中检索我想要调用(Dispose)的接口方法

我调用mono\u object\u get\u virtual\u method以确保实现正确,然后尝试使用接口mono\u runtime\u invoke和接口虚拟方法MonoMethod*(args=NULL)->调用它,但失败

我还尝试使用相同的参数调用mono\u方法\u get\u unmanaged\u thunk,这也不起作用

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

问题是:

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

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

    一旦有了IDispose MonoClass*指针,就应该获得要调用的方法的MonoMethod*,并将其传递给mono_object_get_virtual_method()。此函数的结果是您应该传递给mono_runtime_invoke()的内容

    例如,对于异常,您可以调用get_Message方法,或者如果您使用的是C#code,则可以调用任何处理该异常的方法

    下面是经过简单测试的代码,str是一个单字符串*:

    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。

    这听起来基本上和我的方法一样(除了cast,但这不会有什么坏处)。我会检查异常,看看它是怎么说的。我在上面添加了一些简单的测试代码,它在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()以获得适当的值。