从c#访问delphi dll中的非托管数组

时间:2012-11-16 15:27:08

标签: c# multidimensional-array dllimport managed intptr

我有一个delphi dll,它与相机有交易,并将视频帧存储到此dll内的3d字节数组中。实现rgb格式需要3d维度,这对于dll背景来说很方便(正如开发人员所说)。所以,我必须从c#代码访问该数组,构建一个Bitmap并显示其内容。但我不明白如何正确访问数组元素。 这是我的代码:

    private unsafe void ByteArray2Bitmap(IntPrt data, int width, int height, int depth, out Bitmap bmp)
    {            
        // create a bitmap and manipulate it
        bmp = new Bitmap(width, height, PixelFormat.Format24bppRgb);
        BitmapData bits = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, bmp.PixelFormat);

        fixed(byte*** data = (byte***)(m_data.ToPointer()))
        {
            for (int i = 0; i < height; i++)
            {
                int* row = (int*)((byte*)bits.Scan0 + (i * bits.Stride));
                for (int j = 0; j < width; j++)
                {
                    int pixel = BitConverter.ToInt32(&data[i][j][0], 0);
                    row[j] = pixel;
                }
            }
        }
        bmp.UnlockBits(bits);
    }

该行代码出错:固定语句赋值的右侧可能不是强制转换表达式

fixed(byte*** data = (byte***)(m_data.ToPointer()))

是否有任何方法可以访问多维非托管数组而无需使用Marshal Copy复制它们?

1 个答案:

答案 0 :(得分:0)

您的代码有些令人困惑。您的方法有data参数,并且您尝试使用data语句创建fixed变量。也许参数应该是m_data

在任何情况下,m_data.ToPointer()已经提供了固定地址,因此无需再次修复。你应该可以写:

byte*** data = (byte***)(m_data.ToPointer());

目前还不清楚你到底想要做什么。不过,我非常确定您希望pixel变量为byte而不是int。否则,当您尝试注销位数据的末尾时,您将获得访问异常。