Обмен структурами (включение указателей на другие структуры) между C и C # - PullRequest
0 голосов
/ 01 марта 2010

Я хочу использовать PInvoke, чтобы вывести на управляемую сторону что-то такое:

(код C)

typedef struct {
// некоторые поля ...
} A;

структура типа {
A * a;
} B;

int getB (B * destination) {// destionation будет выходным параметром для C #
// помещаем B в 'destination'
возврат 0;
}

Теперь мне нужен способ рассказать управляемой стороне, как сделать маршаллинг B из структуры или класса C в C #. Я пробовал много вещей, таких как поля IntPtr, атрибуты MarchalAs, но безуспешно. Я не буду раскрывать здесь код, который я постарался сделать для упрощения вопроса. Однако я мог сделать это, когда приходят длинные ответы.

Ответы [ 2 ]

0 голосов
/ 02 марта 2010

Вы можете сделать это с помощью класса Marshal.

// Define a C# struct to match the unmanaged one
struct B
{
    IntPtr a;
}

[DllImport("dllName")]
extern int getB(IntPtr destination);

B GetB()
{
    IntPtr ptrToB = IntPtr.Zero;
    getB(ptrToB);
    return (B)Marshal.PtrToStructure(ptrToB, typeof(B));
}
0 голосов
/ 02 марта 2010

Если бы это был я, я бы использовал небезопасный код и указатели на стороне C #:

public unsafe class UnmanagedStuff {

    public struct A {
        // some fields
    }

    public struct B {
        public A* a;
    }

    // Add appropriate PInvoke attribute here
    public static extern int getB(B* destination);

    public static void UseBForSomething() {

        B b;
        getB(&b);

        // Do something with b

    }

}
...