c#调用c++的结构体和函数,该如何处理
c#调用c++的结构体和函数
在c++的dll文件里是这样定义的:
我在c#里面是这样写的,但是总是不对
主要c#在读struct结构体里面的Num的时候总是不对,读Address和Length都是对的
另外C++里面的byte* WORD*转为c#里面的什么类型最好?
谢谢了
------解决方案--------------------
C++与C#之间有所区别,例如C++中的int在C#中必须使用Int16来表示。
------解决方案--------------------
C++ 和C#的int型的 字节数不一样吧?是不是转换的时候哪里出了问题。
unsafe public static extern UInt16 ReadLabelID(IntPtr hScanner,int nMax,ref tagID IDBuffer,ref int nCounter);
感觉是这里除了问题~~
------解决方案--------------------
"我用的是VS2005
在调试的时候,出现的错误通常是在自动窗口显示:
名称 类型 值
tag.Num: {维数:[40]} byte[,]{byte[]}
数组索引超出界限"
你应该跟踪一下,应该是你在调用的时候出的问题,不是赋值的问题了。
看看它是在哪里索引超出界限?
------解决方案--------------------
可能是Pack=1的问题. 这个表示单字节对齐. 而你的C++代码如果没有指定字节对其的话, 默认可能是4字节或者8字节对齐.
在c++的dll文件里是这样定义的:
- C/C++ code
// ============== 常量定义 ===================== #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#里面是这样写的,但是总是不对
- C# code
[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#里面的什么类型最好?
谢谢了
------解决方案--------------------
C++与C#之间有所区别,例如C++中的int在C#中必须使用Int16来表示。
------解决方案--------------------
C++ 和C#的int型的 字节数不一样吧?是不是转换的时候哪里出了问题。
unsafe public static extern UInt16 ReadLabelID(IntPtr hScanner,int nMax,ref tagID IDBuffer,ref int nCounter);
感觉是这里除了问题~~
------解决方案--------------------
"我用的是VS2005
在调试的时候,出现的错误通常是在自动窗口显示:
名称 类型 值
tag.Num: {维数:[40]} byte[,]{byte[]}
数组索引超出界限"
你应该跟踪一下,应该是你在调用的时候出的问题,不是赋值的问题了。
看看它是在哪里索引超出界限?
------解决方案--------------------
可能是Pack=1的问题. 这个表示单字节对齐. 而你的C++代码如果没有指定字节对其的话, 默认可能是4字节或者8字节对齐.