Как маршалировать структуру как указатель на структуру? - PullRequest
9 голосов
/ 06 мая 2009

Я пытаюсь передать структуру из C # в библиотеку C ++. Я передаю структуру как объект, а функция C ++ ожидает ее как указатель (void *).

У меня проблемы с передачей структуры.

[DllImport("MockVadavLib.dll", CharSet = CharSet.Ansi)]
public static extern IntPtr TheFunction([MarshalAs(UnmanagedType.LPStruct)] UserRec userRec);

Вот текст исключения во время выполнения, который я получаю:

"Cannot marshal 'параметр # 1': недопустимая комбинация управляемого / неуправляемого типа (этот тип значения должен быть связан со Struct)."

Хотя я нашел статью MSDN, которая использует LPStruct именно в этом контексте.

Это моя структура, которую я пытаюсь упорядочить:

[StructLayout(LayoutKind.Sequential)]
public struct UserRec {
    [MarshalAs(UnmanagedType.I4)]
    public int userParam1;
}

Это функция C ++:

MOCKVADAVLIB_API tVDACQ_CallBackRec * TheFunction(void * userParams) {...

Ответы [ 2 ]

17 голосов
/ 06 мая 2009

Попробуйте передать структуру в качестве параметра ref.

[DllImport("MockVadavLib.dll", CharSet = CharSet.Ansi)]
public static extern IntPtr TheFunction(ref UserRec userRec);

Когда вы используете ссылку в сочетании со структурой, она концептуально передает адрес.

13 голосов
/ 28 октября 2011

Кстати, UnmanagedType.LPStruct редко, если вообще когда-либо, является правильным MarshalAs аргументом. Цитата Адама Натана , сотрудника Microsoft:

UnmanagedType.LPStruct поддерживается только для одного конкретного случая: обработка типа значения System.Guid как неуправляемого GUID с дополнительным уровнем косвенности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...