编组二维数组

Posted

技术标签:

【中文标题】编组二维数组【英文标题】:Marshaling two-dimensional array 【发布时间】:2014-02-06 14:45:22 【问题描述】:

我要

int [10][20] //const dimensions size

从 C++ dll 到 C# 代码。有自动编组器吗?无法为如此简单的任务找到好的解决方案。

    public int[,] _operators;

给出未定义的值。 是的,我可以将其制作为仅用于编组的一维,然后在 C# 中将其再次读取为 2 个维度,但是有自动简单的方法吗?

==================

我认为最好的方法是使用这样的指针:

            const int 1dSize = 10;
            const int 2dSize = 10;
            var ret = new int[1dSize, 2dSize];

        unsafe
        
            int* ptrOnArray = NativeLibPrototypes.Get2DArrayPtr();
            for (int i1 = 0; i1 < 1dSize; i1++)
            
                for (int i2 = 0; i2 < 2dSize; i2++)
                
                    ret[i1, i2] = *ptrOnArray;
                    ptrOnArray++;
                
            
         

【问题讨论】:

【参考方案1】:

试试

[MarshalAs(UnmanagedType.ByValArray, SizeConst = 200)]
int[] _operators;

大小应该是数组中元素的数量。

查看Default Marshaling for Arrays

【讨论】:

你在哪里得到未定义的?? 当我查看调试器 _operators 我看到“?”在每个元素处,_operators[0, 0] 给我的索引超出范围...(_operators 是 C++ 类的字段,现在我评论除 _operators 之外的所有内容) 用空项目再测试一次 - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 200)] 仅适用于 1d 数组,适用于 2d - 相同,不起作用

以上是关于编组二维数组的主要内容,如果未能解决你的问题,请参考以下文章

P/Invoke 编组和解组 C# 和非托管 DLL 之间的二维数组、结构和指针

如何在 XLOPER 和 VARIANT 之间编组? [关闭]

C 语言数组 ( 验证二维数组内存是线性的 | 打印二维数组 | 以一维数组方式打印二维数组 | 打印二维数组值和地址 )

C 语言二级指针作为输入 ( 二维数组 | 二维数组遍历 | 二维数组排序 )

JAVA中如何创建一个二维数组,然后给二维数组赋值!

C语言中二维数组行指针是啥