gpt4 book ai didi

c# - 将多维数组从托管代码传递到非托管代码

转载 作者:可可西里 更新时间:2023-11-01 17:39:40 24 4
gpt4 key购买 nike

我想做以下事情:

  1. 在 C# 代码中创建三维数组,如下所示:

    var myArray = new short[x,y,z];
    UnanagedFunction(myArray);
  2. 像这样将它传递给非托管代码 (c++):

    void UnmanagedFunction(short*** myArray)
    {
    short first = myArray[0][0][0];
    }

已更新当我尝试以下代码时出现运行时错误:

Attempted to read or write to protected memory.

谢谢!!!

最佳答案

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;
}

这已经过测试并且有效,唯一的限制是当你完成它时你必须在数组指针上调用 Marshal.FreeHGlobal 否则你会发生内存泄漏,我会还建议您更改 C++ 函数,使其接受数组维度,否则您将只能使用特定大小的 3d 数组

关于c# - 将多维数组从托管代码传递到非托管代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7153521/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com