Поделиться через


Преобразуемые и непреобразуемые типы

Большинство типов данных имеют одинаковое представление как в управляемой, так и в неуправляемой памяти, и не требуют специальной обработки с помощью маршализатора для взаимодействия. Эти типы называются blittable типами , так как они не требуют преобразования при передаче между управляемым и неуправляемым кодом.

Структуры, возвращаемые из вызовов неуправляемого кода, должны иметь непреобразуемый тип. Вызов платформы не поддерживает нелиттируемые структуры в качестве возвращаемых типов.

Следующие типы из пространства имен System относятся к непреобразуемым:

Также непреобразуемыми являются следующие сложные типы:

  • Одномерные массивы непреобразуемых примитивных типов, например массивы целых чисел. Тем не менее тип, содержащий переменный массив непреобразуемых типов, сам по себе не является непреобразуемым.
  • Форматированные типы значений, которые содержат только типы blittable (и классы, если они маршалируются как форматированные типы). Дополнительные сведения о типах форматированных значений см. в разделе "Маршалирование по умолчанию" для типов значений.

Ссылки на объекты не являются перерезаемыми. Кроме того, массив ссылок на объекты, которые являются перерезаемыми сами по себе, не являются перерезаемыми. Например, можно определить структуру, которая является блиттабельной, но нельзя определить блиттабельный тип, содержащий массив ссылок на эти структуры.

В качестве оптимизации массивы примитивных типов и классов, содержащих только члены с возможностью вставки, закрепляются вместо копирования во время маршаллинга. Эти типы могут быть маршалированы как параметры in/Out, когда вызывающий и вызывающий находятся в той же квартире. Однако эти типы на самом деле маршалируются как в параметрах, и необходимо применить InAttribute атрибуты OutAttribute , если вы хотите маршалировать аргумент в качестве параметра In/Out.

Некоторые управляемые типы данных требуют отличающегося представления в неуправляемой среде. Эти неблиттабельные типы данных должны быть преобразованы в форму, которую можно передавать. Например, управляемые строки являются неблиттируемыми типами, поскольку они должны быть преобразованы в строковые объекты, прежде чем их можно будет передаваться.

В следующей таблице перечислены некопируемые типы в пространстве имен System. Делегаты, которые являются структурами данных, ссылающимися на статический метод или экземпляр класса, также являются неблитабельными.

Неблитабельный тип Описание
System.Array Преобразует в массив в стиле C или SAFEARRAY.
System.Boolean Преобразует в одно-, двух- или четырехбайтовое значение, где true выражается как 1 или -1.
System.Char Преобразует в символ Юникода или ANSI.
System.Class Преобразует в интерфейс класса.
System.Object Преобразует в вариант или интерфейс.
System.String Преобразует в строку, завершающуюся ссылкой NULL, или в BSTR.
System.ValueType Преобразует в структуру с фиксированным расположением в памяти.
T[] Преобразует в массив в стиле C или SAFEARRAY.

Типы классов и объектов поддерживаются только COM-взаимодействием.

См. также