通过C&x2B+;带有嵌入式单声道的指向C#的函数指针

通过C&x2B+;带有嵌入式单声道的指向C#的函数指针,c#,c++,c,mono,C#,C++,C,Mono,我有一个C#方法,如下所示: public delegate void VariableObserver(string variableName, object newValue); public void ObserveVariable(string variableName, VariableObserver observer) { // stuff } 此代码嵌入到C++应用程序中,我想从C++调用EngestEvabry> /Cuff>函数,传递函数指针或等价物作为变量观察器

我有一个C#方法,如下所示:

public delegate void VariableObserver(string variableName, object newValue);

public void ObserveVariable(string variableName, VariableObserver observer)
{
    // stuff
}

此代码嵌入到C++应用程序中,我想从C++调用EngestEvabry> /Cuff>函数,传递函数指针或等价物作为<代码>变量观察器< /代码>委托。然后,C代码可以调用委托,C++函数将被调用。p> 我习惯于使用

mono_runtime_invoke
调用C#函数,而且效果很好。但是,我找不到任何关于如何传递函数指针/委托的有用文档示例。你是否需要像处理字符串等类型一样将其装箱?如果是的话,你怎么做?有可能吗

在四处搜索时,我找到了
Marshal.GetDelegateFromFunctionPointer
方法,我想我可以在C#中使用该方法来获取delgate并像往常一样继续,不过我说这已经过时了

编辑:我发现了更多的东西。有一个更新的元帅函数:它看起来很有前途,但是它明确地说:“不能用C++获得的函数指针或GETFUNCTION指针方法使用这个方法。”(< /P>) Edit2:我尝试过只使用GetDelegateForFunctionPointer的建议,但函数指针似乎没有正确编组。请看:

C#代码:

但是,这样做会导致C#的错误:

运行时异常:System.NullReferenceException:对象引用未设置为对象的实例
at(wrapper managed to native)系统。对象:wrapper_native_8348575608244C89(int)
在0中的InkGlue.GlueStory.BindObserver(System.IntPtr observer funcptr)[0x00006]处

这让我相信函数指针没有被成功地传递到C#。关于如何正确传递的任何信息?

我认为
封送。GetDelegateForFunctionPointer
将工作,如果您将标记为
static
的函数的地址传递给它。如果需要,将
作为显式参数传递。

Easy变通方法是一个C垫片。这个问题的其他答案可能也会有所帮助。

谢谢,但我只有这个小用例,我觉得采用它对于这样一个小问题来说太大了。目前正在考虑完全用另一种方式来做。试着添加
extern“C”
到ObserverCallback的声明中,以确保它遵循C调用约定。您可能还需要在委托声明中使用
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
delegate void TestObserver(int num);

public void BindObserver(IntPtr observerFuncPtr)
{
    TestObserver obs = Marshal.GetDelegateForFunctionPointer<TestObserver>(observerFuncPtr);
    obs(1337);
}
static void ObserverCallback(int num)
{
    printf("WE GOT A CALLBACK %d", num);
}

// inside a function I call

void* params[1];
params[0] = &ObserverCallback;

MonoObject* exception;
mono_runtime_invoke(theMonoMethod, theMonoInstance, params, &exception);
Runtime Exception : System.NullReferenceException: Object reference not set to an instance of an object
  at (wrapper managed-to-native) System.Object:wrapper_native_8348575608244C89 (int)
  at InkGlue.GlueStory.BindObserver (System.IntPtr observerFuncPtr) [0x00006] in <78fcd644f8db43978f6f7b1655d0ab2f>:0