Как маршалировать структуру как указатель на структуру?
Вопрос
Я пытаюсь передать структуру из 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) {...
Решение
Попробуйте передать структуру в качестве параметра ref. Р>
[DllImport("MockVadavLib.dll", CharSet = CharSet.Ansi)]
public static extern IntPtr TheFunction(ref UserRec userRec);
Когда вы используете ссылку в сочетании со структурой, она концептуально передает адрес. Р>
Другие советы
Кстати, UnmanagedType.LPStruct
редко, если вообще когда-либо, является правильным аргументом MarshalAs
. Цитата Адама Натана , который является Microsoft сотрудник:
UnmanagedType.LPStruct поддерживается только для одного конкретного случая: рассматривает тип значения System.Guid как неуправляемый GUID с дополнительным уровнем косвенности.