将托管代码中的多维数组传递给非托管代码

Ser*_*her 8 c# c++ marshalling dllimport

我想做以下事情:

  1. 在c#代码中创建三个像素数组,如下所示:

    var myArray = new short[x,y,z];
    UnanagedFunction(myArray);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将它传递给非托管代码(c ++),如下所示:

    void UnmanagedFunction(short*** myArray)
    {
        short first = myArray[0][0][0];
    }
    
    Run Code Online (Sandbox Code Playgroud)

更新 当我尝试以下代码时,我遇到运行时错误:

尝试读取或写入受保护的内存.

谢谢!!!

小智 8

IntPtr Array3DToIntPtr(short[, ,] Val)
        {
            IntPtr ret = Marshal.AllocHGlobal((Val.GetLength(0) + Val.GetLength(1) + Val.GetLength(2)) * sizeof(short));

            int offset = 0;
            for (int i = 0; i < Val.GetLength(0); i++)
            {

                for (int j = 0; j < Val.GetLength(1); j++)
                {
                    for (int k = 0; k < Val.GetLength(2); k++)
                    {
                        Marshal.WriteInt16(ret,offset, Val[i, j, k]);
                        offset += sizeof(short);


                    }
                }
            }

            return ret;
        }
Run Code Online (Sandbox Code Playgroud)

这已经过测试并且可以正常工作,唯一的限制是Marshal.FreeHGlobal当你完成它时你必须调用数组指针或者你会得到内存泄漏,我还建议你改变你的c ++函数,以便它接受数组维度或您只能使用特定大小的3d数组