在c和mono之间传递(函数)指针

在c和mono之间传递(函数)指针,c,delegates,mono,function-pointers,C,Delegates,Mono,Function Pointers,您好,我是指 我可以使用mono_runtime_invoke从托管代码调用方法 现在,我想在托管代码中调用一个方法,并使用一个函数指针(或至少一些指针)作为本机c代码的参数 托管代码 public delegate void MyDelegate (); //method i want to call from native code public static MyDelegate mono_method(MyDelegate c_ptr) { //...do sth

您好,我是指 我可以使用mono_runtime_invoke从托管代码调用方法

现在,我想在托管代码中调用一个方法,并使用一个函数指针(或至少一些指针)作为本机c代码的参数

托管代码

public delegate void MyDelegate ();  
//method i want to call from native code  
public static MyDelegate mono_method(MyDelegate c_ptr)  
{  
    //...do sth 
    return c_ptr;  
}
本机代码

typedef void (*FUNC_PTR)();   
FUNC_PTR my_fct_ptr = some_c_function;  
//calling the managed method        
MonoObject *result_of_mono_method =  
mono_runtime_invoke(mono_method, NULL, my_fct_ptr, NULL);
编辑:指出问题
我怎么打电话

public static unsafe int* mono_method(int *c_ptr)

来自本机c代码,不使用dllImport。

我不确定您想问什么,但这是最简单的回拨方式。

我不确定您想问什么,但这是最简单的回拨方式。

您有几个选择。 一种方法是添加一个内部调用,该调用接受IntPtr(函数指针)和参数:然后将指针转换为函数指针类型,并通常从C代码调用它。 使用libffi之类的工具有助于克服只有一种函数指针类型的限制,这取决于您需要多少,您没有指定

另一个选项是使用Reflection.Emit构建一个动态方法:在该方法中,您将使用calli-IL指令直接调用函数指针。

您有几个选项。 一种方法是添加一个内部调用,该调用接受IntPtr(函数指针)和参数:然后将指针转换为函数指针类型,并通常从C代码调用它。 使用libffi之类的工具有助于克服只有一种函数指针类型的限制,这取决于您需要多少,您没有指定


另一个选项是使用Reflection.Emit构建一个动态方法:在该方法中,您将使用calli-IL指令直接调用函数指针。

在这两个选项中,我没有得到c指针进入c#的点。你能不能写一个例子或者稍微澄清一下?另一个选择是从本机代码中调用一个特定的C#方法,该方法将采用IntPtr并在其上调用Marshal.GetDelegateForFunctionPointer.hmm idk,如果我理解错误的话。但是我不想在c函数指针上放一个mono方法。我只想调用一个以指针作为参数并返回值的mono方法。用:public static unsafe int*mono_method(int*c_ptr)替换上面的托管代码方法,我想从本机cno调用这个方法。我不确定在我的回答中有什么需要澄清的:你看起来很困惑,因为你也改变了问题。无论如何,对于上一个更改,您可以使用mono_runtime_invoke()调用该方法,就像使用任何托管方法一样(这里有几个示例)。这个答案可能不会有帮助,因为您似乎混淆了int*和MyDelegate类型,这意味着大量的混乱正在发生。。。我建议用一个连贯的解释开始一个不同的问题。我不明白两个选项中c指针进入c#的意思。你能不能写一个例子或者稍微澄清一下?另一个选择是从本机代码中调用一个特定的C#方法,该方法将采用IntPtr并在其上调用Marshal.GetDelegateForFunctionPointer.hmm idk,如果我理解错误的话。但是我不想在c函数指针上放一个mono方法。我只想调用一个以指针作为参数并返回值的mono方法。用:public static unsafe int*mono_method(int*c_ptr)替换上面的托管代码方法,我想从本机cno调用这个方法。我不确定在我的回答中有什么需要澄清的:你看起来很困惑,因为你也改变了问题。无论如何,对于上一个更改,您可以使用mono_runtime_invoke()调用该方法,就像使用任何托管方法一样(这里有几个示例)。这个答案可能不会有帮助,因为您似乎混淆了int*和MyDelegate类型,这意味着大量的混乱正在发生。。。我建议用一个连贯的解释开始一个不同的问题。我没有看到你发布了一个链接,因为在我的屏幕上,颜色看起来很均匀。你的链接是从mono/c#调用c(我已经这么做了),但另一方面,我需要从c调用mono/c#,它正在做你希望它做的事情。仔细检查那个来源。它在c代码中设置了一个回调,而c代码本身也在回调,它使用函数指针来实现这一点。他在那里的set_cb()允许c#代码给c代码一个指向需要在c#中调用的函数的指针,c中的call_cb()函数调用该c#代码。没有看到你发布的链接,因为在我的屏幕上,颜色看起来非常均匀。你的链接是从mono/c#调用c(我已经这么做了),但另一方面,我需要从c调用mono/c#,它正在做你希望它做的事情。仔细检查那个来源。它在c代码中设置了一个回调,而c代码本身也在回调,它使用函数指针来实现这一点。其中的set_cb()允许c#代码向c代码提供一个指向需要在c#中调用的函数的指针,c中的call_cb()函数调用该c#代码。