PInvoke C#:Function将指针作为参数

Tis*_*tos 10 c# pinvoke param

我想在我的c#代码中访问这个函数,这可能吗?所以最后c ++代码会调用我的函数并应用名为"sFrameofData"的结构.

C++代码:

//The user supplied function will be called whenever a frame of data arrives.
DLL int Cortex_SetDataHandlerFunc(void (*MyFunction)(sFrameOfData* pFrameOfData));
Run Code Online (Sandbox Code Playgroud)

这可能会奏效吗?

C#代码:

[DllImport("Cortex_SDK.dll")]
public extern static int Cortex_SetDataHandlerFunc(ref IntPtr function(ref IntPtr pFrameOfData) );
Run Code Online (Sandbox Code Playgroud)

aha*_*ker 29

您希望使用与"MyFunction"C++方法的方法签名匹配的委托.

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void MyFunctionDelegate(IntPtr frame);

[DllImport("Cortex_SDK.dll")]
public extern static int Cortex_SetDataHandlerFunc(
[MarshalAs(UnmanagedType.FunctionPtr)]MyFunctionDelegate functionCallback);
Run Code Online (Sandbox Code Playgroud)

  • 我想补充一点,仅调用“Cortex_SetDataHandlerFunc(MyFunc)”(其中“MyFunc”定义为“void MyFunc(IntPtr frame) {...}”)是不够的。“Cortex_SetDataHandlerFunc(MyFunc)”本质上是“Cortex_SetDataHandlerFunc(new MyFunctionDelegate(MyFunc))”,匿名委托对象“new MyFunctionDelegate(MyFunc)”有时可以在“MyFunctionDelegate”返回之前由 GC 处理。在这种情况下,您需要显式创建一个委托对象以避免它被GC:`var myDele = new MyFunctionDelegate(MyFunc); Cortex_SetDataHandlerFunc(myDele);` (2认同)