具有__cdecl回调和委托的C#Interop

一段时间以来,我一直与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),它总是想对我们进行指责。关于如何实现和/或调试的想法?

PZY97649 回答:具有__cdecl回调和委托的C#Interop

在PInvoke原型中添加MarshalAs语句是可行的。我想我以某种方式假设,由于代表被标记为那样,也将以这种方式进行编组。但是,可能有一个原因需要使您更加明确。

"c:\blahblah
本文链接:https://www.f2er.com/3063265.html

大家都在问