日期:2014-05-18  浏览次数:20917 次

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字节对齐.