函数原型:BOOL __stdcall USB_Open (HANDLE *USB, BYTE CardId);调用
 [DllImport("USB.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
  public static extern bool USB_Open(ref IntPtr USB, Byte CardId);
的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。

解决方案 »

  1.   

    __stdcall  --->
    CallingConvention = CallingConvention.StdCall,
      

  2.   

    CallingConvention = CallingConvention.Cdecl这个就是调用约定,试一试其它的。
      

  3.   

    原型是 stdcall 的,
    你的引用确是Cdecl的,这个不匹配
      

  4.   

    改成这样: [DllImport("USB.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
     [return : MarshalAs( UnmanagedType.Bool)]
      public static extern bool USB_Open(IntPtr USB, byte CardId);
    两个问题:
    1、调用约定,两边要一致,C++已经明确是__stdcall!
    2、返回值,C++的BOOL,其实是4个字节,在C#这边如果用bool来对应,
       就必须加上UnmanagedType属性字段来控制:
       Bool 4 字节布尔值(true != 0、false = 0)。这是 Win32 BOOL 类型。 这个在MSDN上有说明,你自己看看