Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将单声道C转换为正在运行的C#程序 我正在用单声道来研究C++程序与C语言程序之间的通信。在Mono网站上,他们有一些将Mono嵌入C程序、启动C#程序、然后在两者之间通信的好例子_C#_C_Interop_Mono - Fatal编程技术网

将单声道C转换为正在运行的C#程序 我正在用单声道来研究C++程序与C语言程序之间的通信。在Mono网站上,他们有一些将Mono嵌入C程序、启动C#程序、然后在两者之间通信的好例子

将单声道C转换为正在运行的C#程序 我正在用单声道来研究C++程序与C语言程序之间的通信。在Mono网站上,他们有一些将Mono嵌入C程序、启动C#程序、然后在两者之间通信的好例子,c#,c,interop,mono,C#,C,Interop,Mono,mono_domain_assembly_open用于打开C#assembly,mono_jit_exec用于运行它 我的问题是,是否可以“连接”到已经运行的程序集?在我看来,mono_jit_exec调用似乎不需要,因为C#assembly已经在运行了。相反,是否会有另一个调用“链接”C和C程序 谢谢 mj您需要使用某种IPC(进程间通信),因为您的C程序无法控制C程序。可能的方法是命名管道、某种TCP/IP通信、远程处理(不确定这是否适用于mono)。您需要使用某种IPC(进程间通信),因为

mono_domain_assembly_open用于打开C#assembly,mono_jit_exec用于运行它

我的问题是,是否可以“连接”到已经运行的程序集?在我看来,mono_jit_exec调用似乎不需要,因为C#assembly已经在运行了。相反,是否会有另一个调用“链接”C和C程序

谢谢


mj

您需要使用某种IPC(进程间通信),因为您的C程序无法控制C程序。可能的方法是命名管道、某种TCP/IP通信、远程处理(不确定这是否适用于mono)。

您需要使用某种IPC(进程间通信),因为您的C程序无法控制C程序。可能的方法是命名管道、某种TCP/IP通信、远程处理(不确定这是否适用于mono)。

我猜您指的是在同一进程中,在C端和托管(C#)端之间交换数据/执行调用的mono特定方法(对于不同的进程,您必须使用套接字,如tcp/ip,并根据需要开发协议或使用现有协议)

首先,要从托管代码中调用C函数,有两种主要机制:

  • P/Invoke调用(有关更多详细信息,请参阅),使用“\uu Internal”作为dll名称,在执行程序中而不是外部库中查找函数
  • InternalCall调用:这是一个作为C函数实现的托管方法,有关简单示例,请参阅mono源代码中的samples/embed/teste.C
两者之间的主要区别在于,使用p/Invoke进行数据编组(例如,托管字符串在C端变为char*字符串),而使用icalls可以直接访问托管对象

另一种方法(从C调用托管方法)的主要机制是调用mono_runtime_invoke()。samples/embed/test invoke.C有几个例子

另一种方法是首先使用p/Invoke封送委托:在C端,您将收到一个可以保存的函数指针(例如,只要您通过将托管委托对象存储到托管类中的静态字段来保持托管委托对象的活动状态)。稍后,您可以使用C端的函数指针调用,您将自动转移到托管世界

如果使用mono_jit_exec()执行的程序集长时间运行,则需要在调用mono_jit_exec()之前在已启动的单独线程上执行mono_runtime_invoke()

嵌入mono时,通常会有一个非常短的Main()方法仅用于初始化,因此mono_jit_exec()会快速返回,您可以在C端的主线程中控制所有内容


如果启动一个单独的线程,请确保在调用任何其他mono函数或操作其中的托管对象之前,先在其内部调用mono_thread_attach()。

我猜您指的是在同一进程中,在C端和托管(C#)端之间交换数据或执行调用的特定于mono的方法(对于不同的进程,您必须使用套接字,如tcp/ip,并根据需要开发协议或使用现有协议)

首先,要从托管代码中调用C函数,有两种主要机制:

  • P/Invoke调用(有关更多详细信息,请参阅),使用“\uu Internal”作为dll名称,在执行程序中而不是外部库中查找函数
  • InternalCall调用:这是一个作为C函数实现的托管方法,有关简单示例,请参阅mono源代码中的samples/embed/teste.C
两者之间的主要区别在于,使用p/Invoke进行数据编组(例如,托管字符串在C端变为char*字符串),而使用icalls可以直接访问托管对象

另一种方法(从C调用托管方法)的主要机制是调用mono_runtime_invoke()。samples/embed/test invoke.C有几个例子

另一种方法是首先使用p/Invoke封送委托:在C端,您将收到一个可以保存的函数指针(例如,只要您通过将托管委托对象存储到托管类中的静态字段来保持托管委托对象的活动状态)。稍后,您可以使用C端的函数指针调用,您将自动转移到托管世界

如果使用mono_jit_exec()执行的程序集长时间运行,则需要在调用mono_jit_exec()之前在已启动的单独线程上执行mono_runtime_invoke()

嵌入mono时,通常会有一个非常短的Main()方法仅用于初始化,因此mono_jit_exec()会快速返回,您可以在C端的主线程中控制所有内容

如果启动单独的线程,请确保在调用任何其他mono函数或操作其中的托管对象之前,先在其中调用mono_thread_attach()