C# 从托管C+传递2D数组+;到非托管C++; 我正在为一个非托管C++代码管理一个C++包装器,并有一个问题。 为了简单起见,我需要通过一个2C数组从C代码到托管C++到非托管C++。我对1D阵列没有问题,但坚持使用2D版本。可以选择将其转换为1D,但我想看看是否还有其他方法

C# 从托管C+传递2D数组+;到非托管C++; 我正在为一个非托管C++代码管理一个C++包装器,并有一个问题。 为了简单起见,我需要通过一个2C数组从C代码到托管C++到非托管C++。我对1D阵列没有问题,但坚持使用2D版本。可以选择将其转换为1D,但我想看看是否还有其他方法,c#,c++,unmanaged,managed,C#,C++,Unmanaged,Managed,为了简单起见,假设我想使用中间包装器将2D数组发送到非托管代码并更改其值 下面是调用托管C++的C#代码: MNumeric wrapper = new MNumeric(); //managed C++ object int[,] dArr = new int[10, 10]; for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) {

为了简单起见,假设我想使用中间包装器将2D数组发送到非托管代码并更改其值

下面是调用托管C++的C#代码:

MNumeric wrapper = new MNumeric();  //managed C++ object
int[,] dArr = new int[10, 10];
for (int i = 0; i < 10; i++)
        {
            for (int j = 0; j < 10; j++)
            {
                dArr[i, j] = 10;
            }
        }
wrapper.ChangeArray(dArr, Convert.ToInt32(Math.Sqrt(dArr.Length)))
void MNumeric::ChangeArray(cli::array<int,2> ^arr, int mySize)
{
      //some code to call Unmanaged C++ passing managed 2D array ???
}
MNumeric包装器=新的MNumeric()//托管C++对象
int[,]dArr=新的int[10,10];
对于(int i=0;i<10;i++)
{
对于(int j=0;j<10;j++)
{
dArr[i,j]=10;
}
}
ChangeArray(dArr,Convert.ToInt32(Math.Sqrt(dArr.Length)))
托管C++:

MNumeric wrapper = new MNumeric();  //managed C++ object
int[,] dArr = new int[10, 10];
for (int i = 0; i < 10; i++)
        {
            for (int j = 0; j < 10; j++)
            {
                dArr[i, j] = 10;
            }
        }
wrapper.ChangeArray(dArr, Convert.ToInt32(Math.Sqrt(dArr.Length)))
void MNumeric::ChangeArray(cli::array<int,2> ^arr, int mySize)
{
      //some code to call Unmanaged C++ passing managed 2D array ???
}
void MNumeric::ChangeArray(cli::array^arr,int mySize)
{
//调用非托管C++通过托管2D数组的代码???
}
非托管C++

void UNumeric::ChangeArray(int** arr, int mySize)
{
    for(int i=0;i<mySize;i++)
    {
        for(int j=0;j<mySize;j++)
        {
            arr[i][j]=i;
        }
    }
}
void UNumeric::ChangeArray(int**arr,int mySize)
{
对于(int i=0;i
void MNumeric::ChangeArray(cli::array<int,2>^arr,int mySize)
{
pin_ptr<int>p=&arr[0,0];//指向arr中第一个元素的pin指针
int*np=p;//指向arr中第一个元素的指针
UNumeric::ChangeArray((int**)np,mySize);
}

您不应该在此处使用强制转换,因为它可能隐藏潜在的重要警告。值得注意的是,2D数组不能转换为
int**
int**
,是指向指针数组的指针。
int*[]
是指向数组的指针。您有一个函数,它需要一个托管
int[][]
,而不是
int[,]
。如果你没有铸造,你的编译器会因为你的尝试而对你大喊大叫。

你的问题是什么?你怎么能做到?这可能吗?所有这些?我认为都可以做到,所以问题是如何做到。Alex,谢谢你的回答,但这个解决方案不起作用。pin_ptr p=&arr[0][0]行抛出错误C3262:无效数组索引:为二维'cli::array^'指定的1个维度Alex,我能够使用pin_ptr p_arr=&arr[0,0];解决此问题,因为它是二维数组而不是锯齿数组。代码现在编译良好,但当我尝试运行时,在u_num->ChangeArray((int**)np,mySize)上获得AccessViolationException行。@lyaw77:在我的回答中用mySize替换arr->Length。谢谢你的回答。我已经尝试过这样做了,但出现了相同的错误:在C中,我有:int[]dArr=new int[10]];在托管C++中:void MNumeric::changearry(cli::array^arr,int mySize){pin ptr parr=&arr[0][0];u num changearry((int**)p_arr,mySize)},我仍然有同样的错误。@ilyaw77:那是因为你从未分配过第二批数组。你分配了一个指针数组,然后再也没有将这些指针设置为指向任何地方。哦,还有,请删除强制类型。谢谢你的建议,我可以使用GCHandle类来完成。