将C ++二维固定长度char数组编组为结构成员

时间:2010-02-15 14:41:41

标签: c# c++ struct multidimensional-array marshalling

我试图调用一个非托管C ++函数,它有一个结构作为输入参数。 结构在头文件中定义如下:

struct MyStruct
{
int     siOrder;
char     aaszNames[6][25];
int     siId[6];
int     siTones[6];        
};

我尝试将托管结构声明如下:

[StructLayoutAttribute(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
public struct MyStruct {

public int siOrder;

[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst=150)]
public string aaszNames;

[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst=6, ArraySubType=UnmanagedType.I4)]
public int[] siId;

[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst=6, ArraySubType=UnmanagedType.I4)]
public int[] siTones;
}

但没有任何成功。我猜测编组失败了,因为aaszNames实际上是一个由六个25长的空终止字符串组成的数组。 我尝试将aaszNames声明为

 [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst=150)]
 public char[] aaszNames;

在必要时用空值填充数组。但是,再一次,没有。

我有什么遗失的吗?我错了什么?编组这个2-D char数组的最佳方法是什么?

请提供任何提示。

4 个答案:

答案 0 :(得分:7)

尝试使用多个C#结构:

[StructLayoutAttribute(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
public struct MyStruct_Name
{
    [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 25)]
    public string name;
}

[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct MyStruct
{
    public int siOrder;

    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 6)]
    public MyStruct_Name aaszNames;

    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 6, ArraySubType = UnmanagedType.I4)]
    public int[] siId;

    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 6, ArraySubType = UnmanagedType.I4)]
    public int[] siTones;
}

这就是我传递C风格字符串数组的方式。

不要忘记创建aaszNames的内容! marshaller讨厌空引用。

MyStruct foo = new MyStruct();
for (int i = 0; i < 6; i++)
{
    foo.aaszNames[i] = new MyStruct_Name();
    foo.aaszNames[i].name = "";
}
祝你好运!

答案 1 :(得分:0)

[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst=150)]
 public char[] aaszNames;

那种编组类型看起来很好。可能在函数调用或内存分配错误/

中发出

答案 2 :(得分:0)

我会写一个小的c程序来检查C结构的字节大小 然后我会按照另一个建议来逐字段提取数据字段 从C的角度来看,/ 0被视为包含在6个字节中的正常字符,而C#将使用长度为5并且隐藏/ 0。

答案 3 :(得分:-3)

char aaszNames[6][25];

C ++类型的字符是8位〜

但C#Type的字符是Unicode,(16位)!

所以C ++类型的字符&lt; - &gt; C#类型的字节