读书人

c#调用c++的结构体和函数,该如何处理

发布时间: 2012-01-19 00:22:27 作者: rapoo

c#调用c++的结构体和函数
在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字节对齐.

读书人网 >C#

热点推荐