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


Общие вопросы взаимодействия

Обновлен: Ноябрь 2007

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

Характеристика

Неуправляемая модель

Управляемая модель

Модель кодирования

На основе интерфейса

На основе объектов

Удостоверение

Глобальные уникальные идентификаторы (GUID)

Строгие имена

Механизм обработки ошибок

Значения HRESULT

Исключения

Совместимость типов

Двоичный стандарт

Стандарт по типам

Определение типа

Библиотека типов

Метаданные

Безопасность типов

Защита типов отсутствует

Необязательная защита

Управление версиями

Постоянное

Гибкое

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

В следующих разделах каждая из характеристик объясняется более подробно.

  • Модели кодирования
    Неуправляемые объекты всегда взаимодействуют через интерфейс; управляемые объекты и классы могут передавать данные напрямую, без реализации интерфейсов.

    По умолчанию при COM-взаимодействии создается интерфейс класса для предоставления через интерфейс управляемых функций COM-компонентам, если объект или класс не реализует этих функций.

  • Механизмы обработки ошибок
    COM-методы обычно возвращают значение HRESULT, указывающее на удачное или неудачное завершение вызова. Управляемый код включает исключения. По умолчанию COM-взаимодействие отображает управляемые исключения в значения HRESULT при сбоях.

  • Удостоверения
    Глобально уникальные идентификаторы (GUID) определяют конкретный неуправляемый тип и не предоставляют сведений о размещении для этого типа. Помимо имени типа строгие имена включают уникальное имя сборки. Поскольку имя сборки однозначно определяет тип, имя типа может повторно использоваться в нескольких сборках. Сборка также вводит в управляемый тип сведения о ключе издателя, версии и размещении. Службы взаимодействия создают идентификаторы GUID и используют при необходимости строгие имена.

  • Обыкновенные структуры данных
    Вызов неуправляемого кода нельзя использовать для возвращения структур или классов по значению, если они содержат конструктор. В общем случае, пользовательские типы, содержащие элементы, не относящиеся к обыкновенным структурам данных, должны возвращаться по ссылке. Обыкновенные структуры данных — это структуры данных, содержащие только пассивные коллекции значений полей, в соответствии со стандартом 14882 ISO/IEC, "Языки программирования — C++". Они не содержат конструкторов, инструкций назначения копий, деструкторов и не являющихся статическими элементов данных, которые сами по себе не являются обыкновенными структурами данных.

  • Совместимость типов
    Типы различны для управляемого и неуправляемого кода, а также зависят от языка программирования.

  • Определения типов
    Разработчику, привыкшему работать с библиотеками типов, известно, что они содержат только открытые типы. Кроме того, библиотека типов может быть необязательной. В управляемой модели программирования наличие сведений о типе является обязательным для всех типов. Службы взаимодействия предоставляют средства для преобразования библиотек типов в метаданные сборок и метаданных в библиотеки типов.

  • Безопасность типов
    Неуправляемые компиляторы не обеспечивают проверку типов указателей, что делает код потенциально подверженным вредным воздействиям. В общем случае управляемый код требует более высокого уровня доверия. Программисты могут продолжать использовать указатели в управляемом коде, хотя на код накладываются ограничения из-за его небезопасного поведения. Службы взаимодействия предотвращают доступ из ненадежного управляемого кода к неуправляемому коду.

  • Управление версиями
    COM-интерфейсы являются неизменными. При изменении интерфейса его необходимо переименовать с помощью нового GUID. Управляемые типы могут развиваться с сохранением для них прежнего имени.

См. также

Другие ресурсы

Вопросы разработки для взаимодействия