2

我继承了一些我需要与之交互的代码。具体来说,我想从 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)

但这只是无稽之谈。

有人了解我的困境吗?多谢!

4

2 回答 2

2

我的看法:

多维数组只是所有维度大小的连续数组。

在您的情况下,“C”代码会将其视为ushort[5 * 100].

要完成这项工作,请执行以下操作:

ushort[,] myTable = new ushort[5, 100];   // multidimensional array

unsafe
{
  fixed (ushort* inputPtr = myTable)
  {
    readTable(inputPtr);
  }
}

不幸的是,我没有时间对此进行测试,但它编译得很好。

于 2013-09-04T07:25:30.113 回答
0

试试这个:

ushort[,] myTable = new ushort[5,100];
readTable(myTable);

除非readTable在指针返回后保留指针,否则封送拆收器对数组的固定和取消固定对您来说可以正常工作。

于 2013-09-04T07:30:08.117 回答