一段时间以来,我一直与Interop一起成功地与外部C库一起工作。太好了我们需要增加使用具有回调功能的功能。这更具挑战性。我们尝试过将其作为IntPtr传递,还有其他一些选择。但是它似乎总是使VisualStudio崩溃。我们还尝试启用本机调试,但是其他库没有调试库,只是到此为止。
相关的C库代码:
#define CVICDecl __cdecl
#define CVICALLBACK CVICDecl
typedef int32 (CVICALLBACK *DAQmxEveryNSamplesEventCallbackPtr)(TaskHandle taskHandle,int32 everyNsamplesEventType,uInt32 nSamples,void *callbackData);
int32 __CFUNC DAQmxRegisterEveryNSamplesEvent(TaskHandle task,uInt32 options,DAQmxEveryNSamplesEventCallbackPtr callbackFunction,void *callbackData);
和C#代码:
[DllImport("nicaiu",CallingConvention = CallingConvention.Cdecl,CharSet = CharSet.Ansi)]
public static extern int DAQmxRegisterEveryNSamplesEvent(IntPtr task,Int32 everyNsamplesEventType,UInt32 nSamples,UInt32 options,EveryNSamplesCallback callbackFunction,IntPtr callbackData);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate Int32 EveryNSamplesCallback(IntPtr taskHandle,IntPtr callbackData);
...
func = new EveryNSamplesCallback(Test2Callback); //func is a class-level variable
tmp += ChkForError(DAQmxRegisterEveryNSamplesEvent(taskHandle_DAT,DAQmx_Val_Transferred_From_Buffer,104,func,new IntPtr()));
...
public Int32 Test2Callback(IntPtr taskHandle,IntPtr callbackData)
{
Console.WriteLine("CALLBACK!!");
return 0;
}
我们在其他地方尝试了许多不同的方法(在签名中使用IntPtr),它总是想对我们进行指责。关于如何实现和/或调试的想法?