PtrToStructure () создает исключение SafeArrayTypeMismatchException - PullRequest
2 голосов
/ 28 декабря 2010

Народ,

Пожалуйста, помогите мне отогнать SafeArrayTypeMismatchException, что я получаю.Мне нужно передать struct в неуправляемую DLL.Один из struct членов является массивом переменной длины.Неуправляемый код будет заполнять его данными, тогда мой код C # будет использовать эти данные.

Мой подход такой:

  1. Получить IntPtr для моей структуры, используя StructureToPtr(), сделатьконечно же, выделение памяти.
  2. Вызовите неуправляемую функцию и передайте IntPtr в качестве параметра
  3. Получите заполненную структуру, используя PtrToStructure()

Еслидля целей упражнения я называю StructureToPtr() и PtrToStructure() вплотную, исключений нет.

PtrToStructure() генерирует SafeArrayTypeMismatchException, если я помещаю вызов в неуправляемую DLL между StructureToPtr() и PtrToStructure().Описание для SafeArrayTypeMismatchException: «Произошло несоответствие между типом среды выполнения массива и подтипом, записанным в метаданных.»

Любое предложение или понимание действительно приветствуются!

Я могуопубликуйте мой код, если необходимо.


- Ник

1 Ответ

1 голос
/ 28 декабря 2010

.NET маршаллер не может обрабатывать массивы C / C ++ неизвестного размера.Массив в .NET всегда имеет фиксированный размер, связанный с ним, но массивы C / C ++ являются просто указателем на блок памяти.Маршаллер не может знать, насколько велик массив, возвращаемый из кода C / C ++, поэтому он выдает исключение.

В вашем случае он пытается сделать массив как SafeArray, которыйэто тип COM - массив, который имеет свой собственный размер, но вы не массив SafeArray.

Нет способа заставить маршаллера обработать это автоматически.Объявите член структуры, который вы используете как IntPtr, и вручную создайте массив .NET и скопируйте значения в него. См. это для примера того, как это сделать.

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