Преобразуемые и непреобразуемые типыBlittable and Non-Blittable Types

Большинство типов данных имеют общее представление как в управляемой, так и в неуправляемой памяти и не требуют специальной обработки со стороны маршалера взаимодействия.Most data types have a common representation in both managed and unmanaged memory and do not require special handling by the interop marshaler. Такие типы называются непреобразуемыми, поскольку при их передаче между управляемым и неуправляемым кодом не требуется преобразование.These types are called blittable types because they do not require conversion when they are passed between managed and unmanaged code.

Структуры, возвращаемые из вызовов неуправляемого кода, должны иметь непреобразуемый тип.Structures that are returned from platform invoke calls must be blittable types. Вызовы неуправляемого кода не поддерживают преобразуемые структуры, такие как типы возвращаемых значений.Platform invoke does not support non-blittable structures as return types.

Следующие типы из пространства имен System относятся к непреобразуемым:The following types from the System namespace are blittable types:

Также непреобразуемыми являются следующие сложные типы:The following complex types are also blittable types:

  • Одномерные массивы непреобразуемых типов, например массивы целых чисел.One-dimensional arrays of blittable types, such as an array of integers. Тем не менее тип, содержащий переменный массив непреобразуемых типов, сам по себе не является непреобразуемым.However, a type that contains a variable array of blittable types is not itself blittable.

  • Форматированные типы значений, содержащие только непреобразуемые типы (и классы, если они маршалируются как непреобразуемые типы).Formatted value types that contain only blittable types (and classes if they are marshaled as formatted types). Дополнительные сведения о форматированных типах значений см. в разделе Маршалинг по умолчанию для типов значений.For more information about formatted value types, see Default marshaling for value types.

Ссылки на объекты не относятся к непреобразуемым типам.Object references are not blittable. Это справедливо для массивов ссылок на объекты, которые сами по себе являются непреобразуемыми.This includes an array of references to objects that are blittable by themselves. Например, можно определить непреобразуемую структуру, однако при этом нельзя определить непреобразуемый тип, который содержит массив ссылок на такие структуры.For example, you can define a structure that is blittable, but you cannot define a blittable type that contains an array of references to those structures.

В целях оптимизации массивы непреобразуемых типов и классов, которые содержат только непреобразуемые члены, при маршалинге закрепляются, а не копируются.As an optimization, arrays of blittable types and classes that contain only blittable members are pinned instead of copied during marshaling. Эти типы могут маршалироваться как параметры ввода-вывода, если вызывающий и вызываемый объект находятся в одном подразделении.These types can appear to be marshaled as In/Out parameters when the caller and callee are in the same apartment. Тем не менее такие типы фактически маршалируются как параметры ввода. Чтобы маршалировать аргумент как параметр ввода-вывода, необходимо применить атрибуты InAttribute и OutAttribute.However, these types are actually marshaled as In parameters, and you must apply the InAttribute and OutAttribute attributes if you want to marshal the argument as an In/Out parameter.

Некоторые управляемые типы данных требуют отличающегося представления в неуправляемой среде.Some managed data types require a different representation in an unmanaged environment. Такие преобразуемые типы данных должны преобразовываться в форму, подходящую для маршалинга.These non-blittable data types must be converted into a form that can be marshaled. Например, управляемые строки относятся к преобразуемым типам, поскольку перед выполнением маршалинга их необходимо преобразовывать в строковые объекты.For example, managed strings are non-blittable types because they must be converted into string objects before they can be marshaled.

В следующей таблице перечислены преобразуемые типы из пространства имен System.The following table lists non-blittable types from the System namespace. Делегаты, представляющие собой структуры данных, которые ссылаются на статический метод или экземпляр класса, также являются преобразуемыми.Delegates, which are data structures that refer to a static method or to a class instance, are also non-blittable.

Преобразуемые типыNon-blittable type ОписаниеDescription
System.ArraySystem.Array Преобразует в массив в стиле C или SAFEARRAY.Converts to a C-style array or a SAFEARRAY.
System.BooleanSystem.Boolean Преобразует в одно-, двух- или четырехбайтовое значение, где true выражается как 1 или -1.Converts to a 1, 2, or 4-byte value with true as 1 or -1.
System.CharSystem.Char Преобразует в символ Юникода или ANSI.Converts to a Unicode or ANSI character.
System.ClassSystem.Class Преобразует в интерфейс класса.Converts to a class interface.
System.ObjectSystem.Object Преобразует в вариант или интерфейс.Converts to a variant or an interface.
System.MdarraySystem.Mdarray Преобразует в массив в стиле C или SAFEARRAY.Converts to a C-style array or a SAFEARRAY.
System.StringSystem.String Преобразует в строку, завершающуюся ссылкой NULL, или в BSTR.Converts to a string terminating in a null reference or to a BSTR.
System.ValuetypeSystem.Valuetype Преобразует в структуру с фиксированным расположением в памяти.Converts to a structure with a fixed memory layout.
System.SzarraySystem.Szarray Преобразует в массив в стиле C или SAFEARRAY.Converts to a C-style array or a SAFEARRAY.

Типы классов и объектов поддерживаются только COM-взаимодействием.Class and object types are supported only by COM interop. Для соответствующих типов в Visual Basic, C# и C++ см. раздел Обзор библиотеки классов.For corresponding types in Visual Basic, C#, and C++, see the Class Library Overview.

См. такжеSee also