Бөлісу құралы:


Блиттабельные и неблиттабельные типы

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

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

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

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

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

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

В качестве оптимизации массивы примитивных типов и классов, содержащих только члены с возможностью вставки, закрепляются вместо копирования во время маршаллинга. Эти типы могут быть маршалированы как входные/выходные параметры, когда вызывающий и вызываемый находятся в одном и том же апартаменте. Однако эти типы на самом деле маршалируются как параметры типа In, и необходимо применить атрибуты 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-взаимодействием.

См. также