Маршалинг структуры C, содержащей массивы, в C #

С большой помощью сообщества stackoverflow мне удалось вызвать встроенную функцию DLL. Однако я не могу изменить значения ID или пересекает массив . Что бы я ни делал на стороне DLL, старое значение остается. Кажется, только для чтения.

Вот несколько фрагментов кода:

Структура C ++:

typedef struct _Face {
    int ID;
    int intersects[625];
} Face;

Отображение C #:

[StructLayout(LayoutKind.Sequential)]
    public struct Face {
        public int ID;

        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 625)]
        public int[] intersects;
    }

Метод C ++ (тип установлен как DLL в VS2010):

extern "C" int __declspec(dllexport) __stdcall 
solve(Face *faces, int n){
for(int i =0; i<n; i++){
    for(int r=0; r<625; r++){
        faces[i].intersects[r] = 333;
        faces[i].ID = 666;
        }
    }

Сигнатура метода C #:

[DllImport("lib.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern int solve(Face[] faces, int len);

Вызов метода C #:

Face[] faces = new Face[10];
faces[0].intersects = new int[625];
faces[0].ID = -1; //.. and add 9 more ..

solve(faces, faces.Length);

// faces[0].ID still equals -1 and not 666

С уважением, e.

10
задан Queequeg 2 December 2011 в 21:00
поделиться