Как маршалировать структуру как указатель на структуру?

StackOverflow https://stackoverflow.com/questions/827672

  •  06-07-2019
  •  | 
  •  

Вопрос

Я пытаюсь передать структуру из 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 с дополнительным уровнем косвенности.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top