我有这样的C ++结构:
typedef struct _FILE_OP_BLOCK
{
unsigned short fid; // objective file ID
unsigned short offset; // operating offset
unsigned char len; // buffer length(update)
// read length(read)
unsigned char buff[240];
} FILE_OP_BLOCK;
现在我想将它映射到.Net中。棘手的是我应该传递fid
的2字节数组和len
的整数,即使在C#fid
中是unsigned short
和{{1} }是len
我想知道下面的结构(在C#中)是否正确?
unsigned char
答案 0 :(得分:1)
[DllImport]属性上的CharSet属性肯定是错误的,需要CharSet.Ansi来获取P / Invoke编组器将其转换为char []。将buff成员声明为字符串以便于使用。虽然将fid成员声明为byte []并没有错,但我真的没有看到它的重点。非托管代码将char []复制到其中是一个实现细节。因此:
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)]
public struct File_OP_Block
{
public ushort fid;
public ushort offset;
public byte length;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 240)]
public string buff;
}
答案 1 :(得分:0)
鉴于C ++ short
数据类型实际上是两个字节,两个字节的数组应该可以工作。 C / C ++中的整数大小没有严格定义,所以标准只说short
至少是两个字节。
C#char
数据类型是16位unicode字符,因此与8位数据类型的C ++ char
数据类型不匹配。您需要一个属性来指定如何将字符编码为字节,或使用字节数组。
您可能需要一个属性来指定打包,以便成员之间没有填充。