Blittable типы - Blittable types

Blittable типы находятся типы данных в Microsoft .NET Framework которые имеют идентичное представление в памяти для обоих удалось и неуправляемый код. Понимание разницы между непреобразуемыми и непреобразуемыми типами может помочь в использовании COM Interop или P / Invoke, два метода для совместимость в приложениях .NET.

Источник

Операцию копирования в память иногда называют блочная передача, сокращено до немного блит (и специальное оборудование для такой передачи называется блиттер ). Blittable - это специфичный для .NET термин, определяющий законность копирования объекта с использованием блочной передачи.

Обзор совместимости

Функциональная совместимость может представлять собой двунаправленный обмен данными и методами между неуправляемый код и управляемый код .NET. .NET предоставляет два способа взаимодействия между ними: COM Interop и P / Invoke. Хотя методология разная, в обоих случаях сортировка (преобразование между представлениями данных, форматами для вызова функций и форматами для возврата значений) должно иметь место. COM-взаимодействие занимается этим преобразованием между управляемым кодом и COM-объекты, тогда как P / Invoke обрабатывает взаимодействие между управляемым кодом и Win32 код. Концепция непреобразуемых и непреобразуемых типов данных применима к обоим - в частности, к проблеме преобразования данных между управляемой и неуправляемой памятью. Этот маршаллинг выполняется маршаллером взаимодействия, который автоматически вызывается CLR при необходимости.

Определены непреобразуемые типы

Преобразуемый тип - это тип данных, который не требует особого внимания со стороны упаковщика взаимодействия, поскольку по умолчанию он имеет общее представление в управляемой и неуправляемой памяти. К закрепление данных в памяти сборщик мусора не сможет перемещать его, что позволяет использовать его совместно с неуправляемым приложением.[1] Это означает, что как управляемый, так и неуправляемый код будут согласованно изменять места в памяти этих типов, и маршалеру требуется гораздо меньше усилий для поддержания целостности данных. Ниже приведены некоторые примеры непреобразуемых типов, доступных в .NET Framework:[2]

  • System.Byte
  • System.SByte
  • System.Int16
  • System.UInt16
  • System.Int32
  • System.UInt32
  • System.Int64
  • System.UInt64
  • System.IntPtr
  • System.UIntPtr
  • System.Single
  • System.Double

Дополнительно одномерный массивы этих типов (в том числе небезопасные фиксированные буферы), а также сложные типы, содержащие только поля экземпляра (включая только чтение fields) этих типов непреобразуемы. Наличие непреобразуемых статических или константных полей не приводит к тому, что тип становится непреобразуемым, поскольку такие поля не играют никакой роли в маршалинге. Сложные типы (то есть структуры или классы) также должны иметь макет поля экземпляра Последовательный применяется с помощью атрибута [StructLayout], чтобы маршалер .NET считал его непреобразуемым. В структурах этот атрибут применяется компилятором автоматически, но он должен быть явно добавлен в определение класса, чтобы сделать класс, не допускающий повторения, непреобразуемым.

Если тип не является одним из непреобразуемых типов, он классифицируется как непреобразуемый. Причина, по которой тип считается непреобразуемым, заключается в том, что для одного представления в управляемой памяти он может иметь несколько потенциальных представлений в неуправляемой памяти или наоборот. В качестве альтернативы может быть только одно представление для типа как в управляемой, так и в неуправляемой памяти. Также часто бывает, что с той или иной стороны просто нет представительства. Ниже приведены некоторые наиболее часто используемые в .NET Framework несовместимые типы:[2]

  • System.Boolean
  • System.Char
  • System.Object
  • System.String

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

использование

Это очень ограничивающее понятие непреобразуемых типов, по-видимому, ограничивает полезность служб взаимодействия, предоставляемых .NET, но это не так. Хотя непреобразуемые типы допускают прямое определение взаимодействующих типов, существуют различные способы явного определения того, как необратимый тип должен быть преобразован маршалером взаимодействия.[3][4] Например, в языках .NET существует множество атрибутов, которые можно применять к полям в типах, к самим типам и к параметрам методов, чтобы указать упаковщику, как обрабатывать эти конкретные данные. Эти атрибуты имеют различные цели, такие как детализация упаковки или выравнивания типа, указание смещений полей в типе, указание представлений массива или строк, управление передача параметров стиль для вызовов функций с указанием управление памятью техники и многое другое. Если ни один из атрибутов или других инструментов, представленных в структуре, не является адекватным, детальный контроль обеспечивается возможностью реализации ICustomMarshaler интерфейс и вручную выполнить преобразование данных в обоих направлениях. Понимание того, что представляет собой непреобразуемый тип, позволяет разработчику определить ситуации, в которых вмешательство требуется и не требуется для правильного маршалинга типа. Таким образом, меньше времени тратится на чрезмерную спецификацию типов или вызовов функций.

Смотрите также

Рекомендации

  1. ^ "MSDN Magazine - P / Invoke Revisited". Msdn.microsoft.com. Получено 2011-12-05.
  2. ^ а б «MSDN - непреобразуемые и непреобразуемые типы». Msdn.microsoft.com. Получено 2016-02-05.
  3. ^ «MSDN - Обзор маршалинга взаимодействия». Msdn.microsoft.com. Получено 2016-02-05.
  4. ^ «MSDN - совместимость с .NET». Msdn2.microsoft.com. Получено 2011-12-05.

внешняя ссылка