Как упорядочить структуру, содержащую указатель на первый элемент массива в стиле C неизвестного типа - PullRequest
2 голосов
/ 26 марта 2012

Я пытаюсь преобразовать из C ++ в C # структуру, которая выглядит примерно так:

typedef struct FooStruct {
    Uint8 bytesPerThingie;
    void *arrayOfThingies;
    // other members ...
}

Итак, в этом случае есть два неизвестных:

  1. Количество элементов в массиве.
  2. Размер (в байтах) каждого элемента.

Ранее я успешно упорядочил саму структуру с таким определением:

[StructLayout(LayoutKind.Sequential)]
public struct FooStruct {
    public byte bytesPerThingie;
    public IntPtr arrayOfThingies;
    // other members...
}

но теперь мне нужно проверить и изменить встроенный массив.

Я понимаю, что

  1. Сам по себе массив элементов Blittable типа Blittable сам по себе, но не когда он используется в качестве поля в структура.
  2. При маршалинге из неуправляемого кода в .NET Framework длина массива равна определяется из аргумента SizeConst, за которым может следовать неуправляемый тип элементов массива, если они не являются блистерными.

Даже если предположить, что в этом случае элементы массива относятся к типу blittable, как я могу установить SizeConst, аргумент времени компиляции, если я не могу знать размер массива до времени выполнения?

1 Ответ

2 голосов
/ 27 марта 2012

Короче говоря, вы не можете. Поле SizeConst в классе MarshalAsAttribute скомпилировано в метаданные на поле и не может быть изменено во время выполнения (по крайней мере, не таким образом, чтобы это было полезно для вас).

Тем не менее, у вас есть следующие опции:

  • Выполните маршалинг содержимого вручную, как вы делали, используя методы класса Marshal .
  • Используйте unsafe для прямого доступа к указателю (и измените свой тип для использования указателей). Для этого требуется /unsafe опция компилятора , которая может или не может быть вариантом для вас.
  • Используйте C ++ / CLI , чтобы создать управляемую оболочку в C ++, которая будет экспортировать типы .NET, но обрабатывать маршалинг в C ++ (что может быть проще, в зависимости от уровня комфорта и сложности API). Вы пытаетесь получить доступ).

Обратите внимание, что во во всех из приведенных выше случаев вам все равно нужно знать длину возвращаемого массива (возможно, он находится в структуре вместе с указателем и типом).

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