我继承了一些我需要与之交互的代码。具体来说,我想从C#调用Marshaled命令。代码调用看起来像这样;
[DllImport(DLL_PATH, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern void readTable([MarshalAs(UnmanagedType.LPArray)] ushort[,] buffer);
因此'readTable'命令填充多维数组'buffer'。
我不能很好地做到这一点,但这是我的(非编译)尝试;
ushort[,] myTable = new ushort[5,100]; // multidimensional array
unsafe
{
fixed (ushort* inputPtr = &myTable[0, 0])
{
readTable(inputPtr);
}
}
显然没有编译,但我是一个修理错误的新手。
我真的想申报;
fixed(ushort[,]* inputPtr = &myTable)
但这只是胡说八道。
任何人都了解我的困境?谢谢你!
答案 0 :(得分:2)
我的看法:
多维数组只是所有维度的连续数组大小。
在您的情况下,“C”代码会将其视为ushort[5 * 100]
。
要完成这项工作,请执行以下操作:
ushort[,] myTable = new ushort[5, 100]; // multidimensional array
unsafe
{
fixed (ushort* inputPtr = myTable)
{
readTable(inputPtr);
}
}
不幸的是,我没有时间对此进行测试,但它编译得很好。
答案 1 :(得分:0)
试试这个:
ushort[,] myTable = new ushort[5,100];
readTable(myTable);
除非readTable
在指针返回后保留指针,否则编组器固定和取消固定数组将对您有效。