C#中使用DllImport调用C++的DLL方法.C++方法中有指针函数要如何避免

C#中使用DllImport调用C++的DLL方法.C++方法中有指针函数要如何处理.
C#中使用DllImport调用C++的DLL方法.C++方法中有指针函数要如何处理.


  /*C++方法*/
  CAAS_SYS_API CAAS_INT CAAS_NtyRecvReg(PFN_CAAS_NTY_ON_RECV pfnNtyOnRecv, CAAS_CHAR *pcNtyName);

  /*C++方法的相关定义*/
  typedef void CAAS_VOID;
  typedef CAAS_VOID (*PFN_CAAS_NTY_ON_RECV)(CAAS_XBUFID zBufId);
  typedef void *CAAS_XBUFID;
  typedef char CAAS_CHAR;



  [DllImport(@"caas_sys.dll", CharSet = CharSet.Ansi, EntryPoint = "CAAS_NtyRecvReg")]
  public static extern int CAAS_NtyRecvReg(delegate_PfnNtyOnRecv pfnNtyOnRecv, StringBuilder zBufId);

  public delegate void delegate_PfnNtyOnRecv(System.IntPtr str);
  public void pfnNtyOnRecv(IntPtr val)
  { 
    MessageBox.Show("Hello");
  } 
  /*调用*/
  private void button1_Click_1(object sender, RoutedEventArgs e)
  {
    StringBuilder zBufId = new StringBuilder();
    CAAS_NtyRecvReg(pfnNtyOnRecv, zBufId);
  }

按照网上说法.C++中的函数指针在C#中只要使用委托就可以了.为什么我这里抛出了异常,是C#中定义方法与C++的方法签名错误,还是我委托的签名错误了,本人不会C++.
错误如下.
对 PInvoke 函数“WpfApplication!WpfApplication.MainWindow::CAAS_NtyRecvReg”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。


------解决方案--------------------
代码没看出什么不对的地方
请关注下面2个地方
1.C++编译的是多字节的还是双字节的(Unicode)
2.编译的平台是x86还是x64
------解决方案--------------------
C#中使用DllImport调用C++的DLL方法.C++方法中有指针函数要如何避免