通过C&x2B+;带有嵌入式单声道的指向C#的函数指针
我有一个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>函数,传递函数指针或等价物作为变量观察器
public delegate void VariableObserver(string variableName, object newValue);
public void ObserveVariable(string variableName, VariableObserver observer)
{
// stuff
}
此代码嵌入到C++应用程序中,我想从C++调用
调用C#函数,而且效果很好。但是,我找不到任何关于如何传递函数指针/委托的有用文档示例。你是否需要像处理字符串等类型一样将其装箱?如果是的话,你怎么做?有可能吗mono_runtime_invoke
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