c#调用c++的结构体和函数

youth0826 2007-10-28 09:20:49
在c++的dll文件里是这样定义的:

// ============== 常量定义 =====================
#define ID_MAX_SIZE 8 // ID号最多8字节(64bits)
#define MAX_LABELS 5 // 一次读写操作最多不超过5个

typedef struct tagID
{
unsigned short Address; // ID号在标签内存中的地址
unsigned short Length; // ID号字节数
unsigned char Num[MAX_LABELS][ID_MAX_SIZE]; // 存放ID号的字节数组
} ID;

//读取标签ID号
apiReturn _stdcall ReadLabelID(HANDLE hScanner, int nMax, ID *IDBuffer, int *nCounter);


我在c#里面是这样写的,但是总是不对

[DllImport("Reader2022DLL.dll")]
unsafe public static extern UInt16 ReadLabelID(IntPtr hScanner,int nMax,ref tagID IDBuffer,ref int nCounter);

public const int ID_MAX_SIZE=8; // ID号最多8字节(64bits)
public const int MAX_LABELS = 5; // 一次读写操作最多不超过5个
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi,Pack=1)]
unsafe public struct tagID
{
public ushort Address; // ID号在标签内存中的地址
public ushort Length; // ID号字节数
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 40)]
public byte [,] Num; // 存放ID号的字节数组
};


主要c#在读struct结构体里面的Num的时候总是不对,读Address和Length都是对的
另外C++里面的byte* WORD*转为c#里面的什么类型最好?
谢谢了
...全文
374 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
yearnwar 2007-10-31
  • 打赏
  • 举报
回复
解决的话,发一下解决方法哦~~
youth0826 2007-10-31
  • 打赏
  • 举报
回复
问题还没有解决~~不过交给别人去做了
可能是c++和c#里面的数据类型问题
谢谢各位了
monkeyfu 2007-10-28
  • 打赏
  • 举报
回复
可能是Pack=1的问题. 这个表示单字节对齐. 而你的C++代码如果没有指定字节对其的话, 默认可能是4字节或者8字节对齐.
yearnwar 2007-10-28
  • 打赏
  • 举报
回复
"我用的是VS2005
在调试的时候,出现的错误通常是在自动窗口显示:
名称 类型 值
tag.Num: {维数:[40]} byte[,]{byte[]}
数组索引超出界限"
你应该跟踪一下,应该是你在调用的时候出的问题,不是赋值的问题了。
看看它是在哪里索引超出界限?
youth0826 2007-10-28
  • 打赏
  • 举报
回复
C++ 和C#的int型的 字节数不一样吧?是不是转换的时候哪里出了问题。
unsafe public static extern UInt16 ReadLabelID(IntPtr hScanner,int nMax,ref tagID IDBuffer,ref int nCounter);
感觉是这里除了问题~~

————————————————————————————
这个函数的返回值是正确的
入口参数:
IntPtr hScanner是句柄,int nMax是设定的一个值,大概范围在1-100左右;
出口参数:
ref tagID IDBuffer,用这个结构体返回需要的值
ref int nCounter,这个是返回个数的,返回值也很正常,确定没错误
yearnwar 2007-10-28
  • 打赏
  • 举报
回复
C++ 和C#的int型的 字节数不一样吧?是不是转换的时候哪里出了问题。
unsafe public static extern UInt16 ReadLabelID(IntPtr hScanner,int nMax,ref tagID IDBuffer,ref int nCounter);
感觉是这里除了问题~~
youth0826 2007-10-28
  • 打赏
  • 举报
回复
我用的是VS2005
在调试的时候,出现的错误通常是在自动窗口显示:
名称 类型 值
tag.Num: {维数:[40]} byte[,]{byte[]}
数组索引超出界限
cnming 2007-10-28
  • 打赏
  • 举报
回复
C++与C#之间有所区别,例如C++中的int在C#中必须使用Int16来表示。
youth0826 2007-10-28
  • 打赏
  • 举报
回复
自己顶
PS:apiReturn是这个ushort类型的返回值

110,529

社区成员

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

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

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