Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中封送ushort[,]多维数组#_C#_Multidimensional Array_Marshalling - Fatal编程技术网

C# 在C中封送ushort[,]多维数组#

C# 在C中封送ushort[,]多维数组#,c#,multidimensional-array,marshalling,C#,Multidimensional Array,Marshalling,我继承了一些需要与之接口的代码。具体来说,我想从C#调用一个封送命令。代码调用如下所示 [DllImport(DLL_PATH, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern void readTable([MarshalAs(UnmanagedType.LPArray)] ushort[,] buffer); 因此,“readTable”命令填充

我继承了一些需要与之接口的代码。具体来说,我想从C#调用一个封送命令。代码调用如下所示

[DllImport(DLL_PATH, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
    public static extern void readTable([MarshalAs(UnmanagedType.LPArray)] ushort[,] buffer);
因此,“readTable”命令填充多维数组“buffer”

我不能很好地做到这一点,但这里是我的(非编译)尝试

显然不是编译,但我是个新手,无法修复错误

我真的想申报

fixed(ushort[,]* inputPtr = &myTable)
但这只是胡说八道

有人了解我的困境吗?谢谢你

我的看法:

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

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

要实现此功能,请执行以下操作:

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

unsafe
{
  fixed (ushort* inputPtr = myTable)
  {
    readTable(inputPtr);
  }
}
不幸的是,我没有时间测试这个,但它编译得很好。

试试这个:

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

除非
readTable
在指针返回后保留指针,否则封送拆收器对数组的固定和取消固定操作将很好地工作。

如果将方法定义为
([MarshalAs(UnmanagedType.LPArray)]ushort[,]buffer)
(如OP所做),则不需要
固定()
不安全的
,但我必须说实话,我从来没有尝试过封送MD数组!我不敢相信我没试过这个-它很好用。首先,我在谷歌上搜索如何定义多维数组(new ushort[5100]),在尝试显而易见的简单案例之前,我遇到了固定和不安全的命令。问题解决了-谢谢!
ushort[,] myTable = new ushort[5,100];
readTable(myTable);