C#调用C++dll报错

小K的大师兄 2013-07-26 01:41:28
用C#调用C++的Dll时报错 对 PInvoke 函数“ActiveTest!ActiveTest.Handset::Handset_GetRecordItem”的调用导致堆栈不对称。自己感觉是结构体转换时不对。


typedef struct _TagActiveInfo
{
BYTE operator_id[8];
BYTE active_time[7];
BYTE obu_sn[8];
BYTE plate_color;
BYTE plate_num[12];
BYTE seat_num ;
BYTE psam_sn[6];
BYTE dev_sn[6];
BYTE resver[23];
}ACTIVE_RECORD;

C++中的以上这个结构体转换为C#应该是什么样的 求大神指点
...全文
117 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
小K的大师兄 2013-07-26
  • 打赏
  • 举报
回复
3楼4楼的写法是对的 现在已经解决了 再问一个问题 怎么用自己写的ActiveX控件去激活设备?
小K的大师兄 2013-07-26
  • 打赏
  • 举报
回复
好像是C++中的结构体 在C#中要加ref
敌敌畏耶 2013-07-26
  • 打赏
  • 举报
回复
[StructLayout(LayoutKind.Sequential)] public struct ACTIVE_RECORD{ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public byte[] operator_id; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)] public byte[] active_time; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public byte[] obu_sn; public byte plate_color; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] public byte[] plate_num; public byte seat_num ; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] public byte[] psam_sn; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] public byte[] dev_sn; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 23)] public byte[] resver; }
敌敌畏耶 2013-07-26
  • 打赏
  • 举报
回复
typedef struct _TagActiveInfo { BYTE operator_id[8]; BYTE active_time[7]; BYTE obu_sn[8]; BYTE plate_color; BYTE plate_num[12]; BYTE seat_num ; BYTE psam_sn[6]; BYTE dev_sn[6]; BYTE resver[23]; }ACTIVE_RECORD; 转为 C#后 一般是这样的 [StructLayout(LayoutKind.Sequential)] public struct ACTIVE_RECORD{ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public byte[] operator_id; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)] public byte[] active_time; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public byte[] obu_sn; public byte plate_color; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] public byte[] plate_num[12]; public byte seat_num ; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] public byte[] psam_sn; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] public byte[] dev_sn; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 23)] public byte[] resver; }
敌敌畏耶 2013-07-26
  • 打赏
  • 举报
回复
参数错误吧···
xian_wwq 2013-07-26
  • 打赏
  • 举报
回复
可google下StructLayout StructLayout特性可控制Structure语句块的元素在内存中的排列方式,以及当这些元素被传递给外部DLL时,运行库排列这些元素的方式。 例如:


    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
    public struct Test
    {
      //obj    
    }

110,539

社区成员

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

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

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