【问题标题】:passing multidimensional array from C# to C++ DLL将多维数组从 C# 传递到 C++ DLL
【发布时间】:2014-02-25 04:16:52
【问题描述】:

我正在将功能添加到将从 C# 接口调用的现有 C++ DLL。代码两端都是开放的。

我需要将一个简单的固定大小的多维数组从接口传递给 DLL。

例如在 C# 中:

byte[, ,] arrayKeys = new byte[3, 2, 4] { 
{ {0x01, 0x23, 0x45, 0x55}, {0xCD, 0xEF, 0x12} }, 
{ {0x9A, 0xBC, 0xDE, 0xAA}, {0x78, 0x90, 0xCD} }, 
{ {0x67, 0x89, 0xA0, 0x98}, {0x90, 0x11, 0x22} }};

我在网上进行了研究,但还没有真正找到完全符合我的参数的东西。我发现最多的是二维数组。如果我遗漏了什么,请随时提供现有链接。

是否涉及编组?我可以直接传递数组还是 C++ 需要某种类型的数组指针?

【问题讨论】:

  • 什么参数? C++ 函数长什么样子?
  • 它不存在。我正在扩展 DLL 功能,因此它是完全开放的。我还是 C# 的新手。在 C++ 中,我会写这样的东西。 void someFunc(byte arrayData[][2][4]) {}

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


【解决方案1】:

您可以将数组的 IntPtr 及其尺寸发送给 cpp 函数。

byte[, ,] arrayKeys = new byte[3, 2, 4] { 
{ {0x01, 0x23, 0x45, 0x55}, {0xCD, 0xEF, 0x12} }, 
{ {0x9A, 0xBC, 0xDE, 0xAA}, {0x78, 0x90, 0xCD} }, 
{ {0x67, 0x89, 0xA0, 0x98}, {0x90, 0x11, 0x22} }};

byte oneDimensionArray = new byte[2*3*4];
for (int i=0; i<2; i++)
{
   for (int j=0; j<3; j++)
   {
      for (int k=0; k<4; k++)
      {
         oneDimensionArray[i*12+j*4+k] = arrayKeys[i,j,k];
      }
   }
}
IntPtr pBytes;
pBytes = Marshal.AllocCoTaskMem(2*3*4/*array dimensions*/);
//Copy data to allocated memory
Marshal.Copy(oneDimensionArray, 0, pBytes, i*j*k);
//Send memory pointer to C++ function
SendArrayToCPP(pBytes, i, j, k);
//free array memory
Marshal.FreeCoTaskMem(pBytes);

【讨论】:

    【解决方案2】:

    如果代码在两端都是开放的,那么请查看推荐用于自动化的 SAFEARRAY 数据类型。

    您可以在此处找到MSDN 参考。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-01
      • 1970-01-01
      • 2013-05-14
      • 1970-01-01
      • 2021-01-29
      • 2013-02-19
      • 2018-07-28
      • 1970-01-01
      相关资源
      最近更新 更多