C# 如何在C中为mono运行时创建接口实现的委托?

C# 如何在C中为mono运行时创建接口实现的委托?,c#,c,mono,interop,C#,C,Mono,Interop,我试图通过一些使用mono的c#(或f#)代码来扩展用c为linux编写的库 从c调用c#的简单示例看起来非常简单: //c# code, compiled with mcs -t:library Ex1.cs public static class Ex1 { public class Inner { public static void someAction(int i) { System.Console.WriteLine("some action with " +

我试图通过一些使用mono的c#(或f#)代码来扩展用c为linux编写的库

从c调用c#的简单示例看起来非常简单:

//c# code, compiled with mcs -t:library Ex1.cs
public static class Ex1 {
  public class Inner {
    public static void someAction(int i) {
      System.Console.WriteLine("some action with " + i);
    }
  }
}

//c code, compiled with gcc ex1.c $(pkg-config --cflags --libs mono-2)
#include <mono/jit/jit.h>
#include <mono/metadata/assembly.h>

int main()
{
  MonoDomain *domain = mono_jit_init("Ex1.dll");
  MonoAssembly *assembly = mono_domain_assembly_open(domain, "Ex1.dll");
  MonoImage *image = mono_assembly_get_image(assembly);

  MonoClass *class_ptr = mono_class_from_name(image, "", "Ex1/Inner");
  MonoMethod *class_method = mono_class_get_method_from_name_flags(
      class_ptr, "someAction", 1, 0);

  void *args[1];
  int value = 42;
  args[0] = &value;
  mono_runtime_invoke(class_method, NULL, args, NULL);

  mono_jit_cleanup(domain);
  return 0;
}
//c#代码,用mcs-t:library Ex1.cs编译
公共静态类Ex1{
公共阶级内部{
公共静态操作(int i){
System.Console.WriteLine(“带有“+i”的某些操作);
}
}
}
//c代码,使用gcc ex1.c$(pkg config--cflags--libs mono-2)编译
#包括
#包括
int main()
{
MonoDomain*domain=mono_jit_init(“Ex1.dll”);
MonoAssembly*assembly=mono_domain_assembly_open(域,“Ex1.dll”);
MonoImage*image=mono_assembly_get_image(assembly);
MonoClass*class_ptr=mono_class_from_name(图像,“,”Ex1/Inner“);
MonMethod*class\u method=mono\u class\u从\u名称\u标志获取\u方法(
类ptr,“某些行动”,1,0);
void*args[1];
整数值=42;
参数[0]=&value;
mono_运行时_调用(class_方法,NULL,args,NULL);
mono_jit_清理(域);
返回0;
}
正在运行。/a.out我们可以看到c#library的输出

但是否可以在c端实现c#中定义的接口或至少委托

例如:

//c# compiled mcs -t:library Ex2.cs
public static class Ex2 {
  public interface MyInterface {
    void someAction(int i);
  }

  public delegate void MyDelegate(int i);

  public static class Inner {
    static public void someAction1(MyInterface iface, int value) {
      iface.someAction(value);
    }
    static public void someAction2(MyDelegate d, int value) {
      d(value);
    }
  }
}


//c compiled with gcc ex2.c $(pkg-config --cflags --libs mono-2)
#include <mono/jit/jit.h>
#include <mono/metadata/assembly.h>

int main()
{
  MonoDomain *domain = mono_jit_init("Ex2.dll");
  MonoAssembly *assembly = mono_domain_assembly_open(domain, "Ex2.dll");
  MonoImage *image = mono_assembly_get_image(assembly);

  MonoClass *class_ptr = mono_class_from_name(image, "", "Ex2/Inner");
  MonoMethod *class_method1 = mono_class_get_method_from_name_flags(
      class_ptr, "someAction1", 2, 0);
  MonoMethod *class_method2 = mono_class_get_method_from_name_flags(
      class_ptr, "someAction2", 2, 0);

  void *args1[2];
  int value1 = 42;
  args1[0] = NULL;//how to correctly initialize this?
  args1[1] = &value1;
  mono_runtime_invoke(class_method1, NULL, args1, NULL);

  void *args2[2];
  int value2 = 42;
  args2[0] = NULL; //or this?
  args2[1] = &value2;
  mono_runtime_invoke(class_method2, NULL, args2, NULL);

  mono_jit_cleanup(domain);
  return 0;
}
/c#编译的mcs-t:library Ex2.cs
公共静态类Ex2{
公共接口MyInterface{
无效动作(inti);
}
公共委托无效MyDelegate(int i);
公共静态类内部{
静态公共void someAction1(MyInterface iface,int值){
一些行为(价值);
}
静态公共void someAction2(MyDelegate d,int值){
d(价值);
}
}
}
//使用gcc ex2.c$(pkg config--cflags--libs mono-2)编译的c
#包括
#包括
int main()
{
MonoDomain*domain=mono_jit_init(“Ex2.dll”);
MonoAssembly*assembly=mono_domain_assembly_open(域,“Ex2.dll”);
MonoImage*image=mono_assembly_get_image(assembly);
MonoClass*class_ptr=mono_class_from_name(图像,“,”Ex2/Inner“);
MonMethod*class_method1=mono_class_get_method_from_name_标志(
第1类,“某些行动1”,第2类,第0类);
MonMethod*class_method2=mono_class_get_method_from_name_标志(
类ptr,“某些行动2”,2,0);
void*args1[2];
整数值1=42;
args1[0]=NULL;//如何正确初始化此参数?
args1[1]=&value1;
mono_运行时_调用(类_方法1,NULL,args1,NULL);
void*args2[2];
整数值2=42;
args2[0]=NULL;//还是这个?
args2[1]=&value2;
mono_运行时_调用(class_method2,NULL,args2,NULL);
mono_jit_清理(域);
返回0;
}

预先感谢。< /P>决定你要问什么,C或C++。够公平的。我将所有内容都更改为C,因为MonoAPI在C中。