互操作结构:无符号短路是否应映射到byte []?

时间:2010-04-09 07:14:08

标签: c# interop

我有这样的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

2 个答案:

答案 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数据类型不匹配。您需要一个属性来指定如何将字符编码为字节,或使用字节数组。

您可能需要一个属性来指定打包,以便成员之间没有填充。