C#中调用C++Dll 数据类型问题

shulei521 2011-11-20 10:02:35
函数原型: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 签名的调用约定和参数与非托管的目标签名是否匹配。
...全文
91 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
铜臂阿铁木 2011-11-21
  • 打赏
  • 举报
回复
楼上各种大牛解释完成了……来晚了
sdl2005lyx 2011-11-21
  • 打赏
  • 举报
回复
改成这样:

[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上有说明,你自己看看。。。
bdmh 2011-11-21
  • 打赏
  • 举报
回复
原型是 stdcall 的,
你的引用确是Cdecl的,这个不匹配
宝_爸 2011-11-21
  • 打赏
  • 举报
回复
CallingConvention = CallingConvention.Cdecl

这个就是调用约定,试一试其它的。
gomoku 2011-11-21
  • 打赏
  • 举报
回复
__stdcall --->
CallingConvention = CallingConvention.StdCall,
shulei521 2011-11-21
  • 打赏
  • 举报
回复
非常感谢。

110,529

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧