c# - 将多维数组从 C# 传递到 C++ DLL

标签 c# c++ multidimensional-array marshalling

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

我需要将一个简单的固定大小的多维数组从接口(interface)传递到 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++ 需要某种类型的数组指针?

最佳答案

您可以将数组的 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);

关于c# - 将多维数组从 C# 传递到 C++ DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22004455/

相关文章:

c# - 声明 List<IEntity<T>> 其中 T :class

c# - 如何从控制台读取矩阵并打印所有矩阵元素的总和

javascript - 比较javascript中的多维数组

c++ - 如何使 createprocess 重新定向输入成功,我已成功获得重新定向输出结果

c++ - C++如何在二维 vector 初始化中创建不同的 vector ?

c# - 使用 C# 查询 MariaDB 数据库

c# - 如何将毫秒的日期时间转换为 C# 中的字符串?

c# - 为每个 GeckoFx 实例使用不同的代理

c++ - 如何简洁地表达包含 T 类型值的范围的 C++20 概念?

c++ - 求小数位数总和的最快方法