TTh*_*eot 4 c# c++ struct marshalling multidimensional-array
我试图调用一个非托管C++函数,它具有一个结构作为输入参数.结构在头文件中定义如下:
struct MyStruct
{
int siOrder;
char aaszNames[6][25];
int siId[6];
int siTones[6];
};
Run Code Online (Sandbox Code Playgroud)
我试图将托管结构声明如下:
[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;
}
Run Code Online (Sandbox Code Playgroud)
但没有任何成功.我猜测编组失败了,因为aaszNames实际上是一个由六个25长的空终止字符串组成的数组.我尝试将aaszNames声明为
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst=150)]
public char[] aaszNames;
Run Code Online (Sandbox Code Playgroud)
必要时用空值填充数组.但是,再一次,没有.
有什么我想念的吗?我错了什么?编组这个2-D char数组的最佳方法是什么?
请给我任何提示.
小智 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;
}
Run Code Online (Sandbox Code Playgroud)
这就是我传递C风格字符串数组的方式.
别忘了创建aaszNames的内容!marshaller讨厌空引用.
MyStruct foo = new MyStruct();
for (int i = 0; i < 6; i++)
{
foo.aaszNames[i] = new MyStruct_Name();
foo.aaszNames[i].name = "";
}
Run Code Online (Sandbox Code Playgroud)
祝好运!