将多维数组从C#传递给C ++ DLL

时间:2014-02-25 04:16:53

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

我正在为将从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} }};

我在网上研究过,但还没有找到任何符合我参数的东西。我发现最多的是2D阵列。如果我错过了什么,请不要犹豫,提供现有的链接。

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

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

如果代码在两端打开,那么请查看推荐用于Automation的SAFEARRAY数据类型。

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