函数原型: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 签名的调用约定和参数与非托管的目标签名是否匹配。
[DllImport("USB.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern bool USB_Open(ref IntPtr USB, Byte CardId);
的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。
CallingConvention = CallingConvention.StdCall,
你的引用确是Cdecl的,这个不匹配
[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上有说明,你自己看看