как передать массив объектов из С# в С++ с помощью Dllimport?

Я работаю над проектом, в котором требуется передать массив объектов из С# в С++ по ссылке, и когда я передаю один объект по ссылке, он успешно возвращается по новому значению, но когда я передаю массив, он возвращается со старым значением, так что не так с мой код?

Код C++

extern "C" __declspec(dllexport) int solve(Cell*(&xx)[5][5]) {
xx[0][0]->side = 55;
return xx[0][0]->side;
}

и код C#

internal static class UnsafeMethods
{
[DllImport(@"E:\Cs\4th Year\HPC\Parallel_calculations\Debug\Parallel_calculations.dll", EntryPoint = "solve", CallingConvention = CallingConvention.Cdecl)]
public static extern int solve([MarshalAs(UnmanagedType.SafeArray)] ref Cell[,] x);
}

 Cell[,] arr = new Cell[5, 5];
        for (int i = 0; i < arr.GetLength(0); i++)
        {
            for (int y = 0; y < arr.GetLength(1); y++)
            {
                arr[i, y] = new Cell(0, 0, 0, false, false, false, 50);
            }
        }
        arr[0, 0].side = 4;
        int x = UnsafeMethods.solve(ref arr);
        Console.WriteLine(x + " " + arr[0, 0].side);

x с новым значением, но arr[0,0].side возвращает старое значение


person Ahmed Mohamed    schedule 22.12.2016    source источник
comment
Возможный дубликат Передать многомерный массив из управляемого кода в неуправляемый код   -  person Eugene Podskal    schedule 22.12.2016
comment
нет, я могу отправить его заранее, но без ссылки!   -  person Ahmed Mohamed    schedule 22.12.2016
comment
Я не уверен, что можно правильно передать многомерный массив в нативную функцию, кроме того, как это описано в связанном вопросе, но я могу ошибаться. В любом случае массивы сами по себе передаются как параметры [In] - msdn.microsoft.com/en-us/library/z6cfh6e6(v=vs.110).aspx. Поэтому вы должны хотя бы попытаться добавить атрибут [InOut] в параметр массива. Если это не сработает, вам следует попробовать предложенное решение, а затем вручную восстановить массив - stackoverflow.com/questions/6747112/   -  person Eugene Podskal    schedule 22.12.2016
comment
до сих пор ни один из двух ответов не решает мою проблему, и я могу передать массив только по значению! Любая помощь   -  person Ahmed Mohamed    schedule 22.12.2016
comment
Другая проблема с вашим кодом заключается в том, что вы указываете UnmanagedType.SafeArray, но код C++ использует ссылку на массив (в основном указатель на указатель на первый элемент массива). Правильным типом C++ для использования является структура SAFEARRAY. В противном случае оставьте код C++ как есть и укажите UnmanagedType.LPArray в C#. Кроме того, как упоминалось в другом постере, массивы всегда маршалируются как одномерные между управляемым и неуправляемым кодом.   -  person user1610015    schedule 23.12.2016
comment
хорошо, я пытаюсь UnmanagedType.LPArray, но я получаю другое исключение, и массивы всегда маршалируются как одномерные между управляемым и неуправляемым кодом, как я могу успешно отправить массив 2d int из С# в С++, вся проблема, когда я передаю 2d массив из объект ячейки   -  person Ahmed Mohamed    schedule 23.12.2016
comment
и когда я не использую маршейл, он не отправляется в функцию С++   -  person Ahmed Mohamed    schedule 23.12.2016
comment
Вам, вероятно, потребуется создать сборку C++/cli, чтобы заполнить пробел. Вы не можете сделать это с прямым pinvoke   -  person Scott Chamberlain    schedule 23.12.2016
comment
что вы подразумеваете под созданием сборки C++/cli для преодоления разрыва @ScottChamberlain   -  person Ahmed Mohamed    schedule 23.12.2016
comment
Это позволяет комбинировать собственный и управляемый код msdn.microsoft.com/en- us/library/68td296t.aspx   -  person Scott Chamberlain    schedule 23.12.2016