Общие сведения о надстройках WPF

Компонент .NET Framework включает модель надстройки, которою разработчики могут использовать для создания приложений, поддерживающих расширяемость надстроек. Эта модель надстройки позволяет интегрировать надстройки и расширять функциональные возможности приложения. В некоторых скриптах приложения также должны отображать несколько пользовательских интерфейсов UIs, предоставляемых надстройками. В этом разделе рассматривается порядок добавления модели надстройки .NET Framework приложением WPF для поддержки таких сценариев, а также лежащая в основе этого порядка архитектура, ее преимущества и ограничения.

В этом разделе содержатся следующие подразделы.

  • Предварительные требования
  • Общие сведения о надстройках
  • Общие сведения о моделях надстроек платформы .NET Framework
  • Надстройки WPF
  • Надстройка возвращает интерфейс пользователя
  • Надстройка является интерфейсом пользователя
  • Возвращение нескольких пользовательских интерфейсов из надстройки
  • Надстройки и приложения обозревателя XAML
  • Архитектура надстройки WPF
  • Преимущества надстроек WPF
  • Ограничения надстройки WPF
  • Оптимизация производительности
  • Связанные разделы

Предварительные требования

Знакомство с моделью надстройки .NET Framework является обязательным. Дополнительные сведения см. в разделе Надстройки и расширения среды ("Общие сведения о надстройках").

Общие сведения о надстройках

Чтобы избежать сложности перекомпиляции и повторного развертывания приложения для внедрения новых функциональный возможностей, в приложениях реализуются механизмы расширяемости, позволяющие разработчикам (основным и сторонним производителям) создавать приложения, поддерживающие интеграцию с предыдущим приложением. Наиболее распространенным способом поддержки этого типа расширяемости является внутреннее использование надстроек (также называемых встроенными компонентами или подключаемыми модулями). Ниже приведены примеры реальных приложений, которые обеспечивают расширяемость с помощью надстроек.

  • Встроенные компоненты Internet Explorer.

  • Подключаемые модули проигрывателя Windows Media.

  • Надстройки Visual Studio.

Например, модель надстройки проигрывателя Windows Media позволяет сторонним разработчикам реализовать подключаемые модули, которые различными способами расширяют проигрыватель, включая создание декодеров и кодировщиков для форматов мультимедиа, изначально не поддерживаемых проигрывателем Windows Media (например DVD, MP3), звуковые эффекты и обложки. Каждая модель надстройки встраивается для предоставления функциональных возможностей, уникальных для приложения, хотя существует несколько элементов и поведений, общих для всех моделей надстроек.

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

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

  • Ведущие приложения предоставляют функциональные возможности для интеграции с надстройками.

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

  • Обнаружение: поиск надстроек, которые соответствуют контрактам, поддерживаемым приложениями.

  • активация — загрузка, запуск и установка соединения с надстройками;

  • изоляция — использование доменов или процессов приложений для установления границ изоляции, защищающих приложения от потенциальных проблем безопасности и неполадок выполнения в надстройках;

  • связь — разрешение надстройкам и ведущим приложениям взаимодействовать друг с другом через границы изоляции, путем вызова методов и передачи данных;

  • управление временем существования — загрузка и выгрузка доменов и процессов приложений ясным, прогнозируемым способом (см. раздел Домены приложений);

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

В конечно счете, разработка надежной модели надстройки является нетривиальный задачей. По этой причине компонент .NET Framework обеспечивает инфраструктуру для построения моделей надстроек.

ПримечаниеПримечание

Более подробные сведения о надстройках см. в разделе Надстройки и расширения среды.

Общие сведения о моделях надстроек платформы .NET Framework

Модель надстроек .NET Framework, находящаяся в пространстве имен System.AddIn, содержит набор типов, которые предназначены для упрощения развития расширяемости надстроек. Базовым модулем модели надстройки .NET Framework является контракт, который определяет порядок взаимодействия ведущего приложения и надстройки. Контракт отображается в ведущем приложении с помощью отдельного представления контракта для ведущего представления. Таким же образом, отдельное представление контракта для надстройки отображается в надстройке. Для связи между ведущим приложением и надстройкой и соответствующими представлениями контракта используется адаптер. Контракты, представления и адаптеры относятся к сегментам, и набор связанных сегментов составляет конвейер. Модель надстроек .NET Framework использует конвейеры как основу для поддержки обнаружения, активации, изоляции безопасности, изоляции выполнения (с помощью доменов приложений и процессов), связи, управления временем жизни и управления версиями.

Суммарно эта поддержка позволяет разработчикам создавать надстройки, интегрируемые с функциональными возможностями ведущего приложения. Однако в некоторых скриптах ведущее приложение должно отображать несколько пользовательских интерфейсов UIs, предоставляемых надстройками. Поскольку каждая технология представления в компоненте .NET Framework имеет собственную модель реализации UIs, модель надстройки .NET Framework не поддерживает какую-либо отдельную технологию представления. Вместо этого WPF расширяет модель надстройки .NET Framework посредством поддержки UI для надстроек.

Надстройки WPF

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

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

    • Внешний вид UI, который возвращается надстройкой, зависит от данных или состояния во время выполнения, например — динамически созданные отчеты.

    • Компонент UI для служб, предоставляемых какой-либо надстройкой, отличается от компонента UI ведущих приложений, которые могут использовать данную надстройку.

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

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

    • Надстройка не предоставляет служб, кроме тех, которые отображаются, такие как объявление.

    • Пользовательский интерфейс UI для служб, предоставляемых надстройкой, является общим для всех ведущих приложений, которые могут использовать эту надстройку, например калькулятор или палитра цветов.

Эти сценарии требуют, чтобы объекты UI могли передаваться между ведущими приложениями и доменами приложений надстроек. Поскольку модель надстроек .NET Framework использует удаленное взаимодействие между доменами приложений, передаваемые между ними объекты должны поддерживать удаленный режим работы.

Удаленный объект является экземпляром класса, который относится к следующим процессам.

ПримечаниеПримечание

Дополнительные сведения о создании удаленных объектов .NET Framework см. в разделе Making Objects Remotable.

Типы пользовательского интерфейса UI приложения WPF не поддерживают удаленное взаимодействие. Чтобы решить проблему, приложение WPF расширяет модель надстройки .NET Framework, чтобы включить пользовательский интерфейс UI приложения WPF, созданный надстройками для отображения из ведущих приложений. Эта поддержка обеспечивается приложением WPF посредством двух типов: интерфейсом INativeHandleContract и двумя статическими методами, реализованными классом FrameworkElementAdapters: ContractToViewAdapter и ViewToContractAdapter. На высоком уровне эти типы и методы используются следующим образом.

  1. Приложение WPF требует, чтобы несколько пользовательских интерфейсов UIs, предоставляемых надстройками, были прямо или косвенно производными классами таких объектов FrameworkElement, как фигуры, элементы управления, пользовательские элементы управления, панели макетов и страницы.

  2. Везде, где контракт объявляет, что пользовательский интерфейс будет передан между надстройкой и ведущим приложением, он должен быть объявлен как объект INativeHandleContract (не объект FrameworkElement); объект INativeHandleContract является удаленным представлением пользовательского интерфейса UI надстройки, который может быть передан через границы изоляции.

  3. Перед передачей из домена приложения надстройки объект FrameworkElement упаковывается как INativeHandleContract путем вызова метода ViewToContractAdapter.

  4. После передачи в домен ведущего приложения объект INativeHandleContract должен быть распакован как FrameworkElement путем вызова метода ContractToViewAdapter.

Порядок использования объекта INativeHandleContract и метода ContractToViewAdapter и ViewToContractAdapter зависит от конкретного скрипта. В следующих разделах содержатся сведения для каждой модели программирования.

Надстройка возвращает интерфейс пользователя

Чтобы надстройка возвратила UI ведущему приложению, требуются следующие условия.

  1. Ведущее приложение, надстройка и конвейер должны быть созданы, как описано в документации .NET Framework Надстройки и расширения среды.

  2. Контракт должен реализовывать объект IContract, и чтобы вернуть UI, контракт должен объявить метод с возвращаемым значением типаINativeHandleContract.

  3. Пользовательский интерфейс UI, который передается между надстройкой и ведущим приложением, должен быть прямо или косвенно производным объекта FrameworkElement.

  4. Пользовательский интерфейс UI, возвращаемый надстройкой, перед пересечением границы изоляции должен быть преобразован из объекта FrameworkElement в объект INativeHandleContract.

  5. После пересечения границы изоляции возвращаемый пользовательский интерфейс UI должен быть преобразован из объекта INativeHandleContract в объект FrameworkElement.

  6. Ведущее приложение отображает возвращаемый объект FrameworkElement.

Пример, демонстрирующий реализацию надстройки, которая возвращает пользовательский интерфейс UI, см. в разделе Практическое руководство. Создание надстройки, возвращающей пользовательский интерфейс.

Надстройка является интерфейсом пользователя

Если надстройкой является UI, необходимы следующие условия.

  1. Ведущее приложение, надстройка и конвейер должны быть созданы, как описано в документации .NET Framework Надстройки и расширения среды.

  2. Интерфейс контракта для надстройки должен реализовывать INativeHandleContract.

  3. Надстройка, которая передается в ведущее приложение, должна быть прямо или косвенно производной объекта FrameworkElement.

  4. Перед пересечением границы изоляции надстройка должна быть преобразована из объекта FrameworkElement в объект INativeHandleContract.

  5. После пересечения границы изоляции надстройка должна быть преобразована из объекта INativeHandleContract в объект FrameworkElement.

  6. Ведущее приложение отображает возвращаемый объект FrameworkElement.

Пример, демонстрирующий реализацию надстройки, которая является UI, см. в разделе Практическое руководство. Создание надстройки, являющейся пользовательским интерфейсом.

Возвращение нескольких пользовательских интерфейсов из надстройки

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

Надстройки и приложения обозревателя XAML

До сих пор в примерах рассматривалось автономно установленное ведущее приложение. Однако надстройки также может размещать приложение XAML browser applications (XBAPs) со следующими дополнительными требованиями к построению и реализации.

  • Манифест приложения XBAP должен быть настроен отдельно для загрузки конвейера (папок и сборок) и сборки надстройки в кэш приложения ClickOnce на клиентском компьютере, в той же папке, в которой находится приложение XBAP.

  • Код XBAP для обнаружения и загрузки надстроек должен использовать для приложения XBAP кэш приложения ClickOnce в качестве местоположения конвейера и надстройки.

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

Эти задачи описаны в следующих подразделах.

Настройка конвейера и надстройки для развертывания ClickOnce

Приложения XBAPs загружаются в безопасную папку и запускаются из нее в кэше развертывания ClickOnce. Для размещения надстройки приложением XBAP сборка конвейера и надстройки должна также загружаться в безопасную папку. Для этого необходимо настроить манифест приложения, чтобы включить сборку конвейера и надстройки для загрузки. Наиболее просто это можно сделать в приложении Visual Studio, хотя сборка конвейера и надстройки должна находиться в корневой папке проекта ведущего приложения XBAP, чтобы приложение Visual Studio могло обнаружить сборки конвейера.

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

Таблица 1. Пути вывода построения для сборок конвейера, размещаемых приложением XBAP

Проект сборки конвейера

Выходной путь построения

Контракт

.. \HostXBAP\Contracts\

Представление надстройки

.. \HostXBAP\AddInViews\

Адаптер на стороне надстройки

.. \HostXBAP\AddInSideAdapters\

Адаптер на стороне узла

.. \HostXBAP\HostSideAdapters\

Надстройка

.. \HostXBAP\AddIns\WPFAddIn1

Следующим шагом является определение сборок конвейеров и сборки надстройки в качестве файлов содержимого XBAPs в приложении Visual Studio посредством следующих действий.

  1. Включите сборку конвейера и надстройки в проекте — для этого щелкните правой кнопкой каждую папку конвейера в обозревателе решений и выберите Включить в проект.

  2. В окне Свойства установите для параметра Действие при построении каждой сборки конвейера и надстройки значение Содержимое.

Заключительным шагом является настройка манифеста приложения, чтобы включить файлы сборки конвейера и файл сборки надстройки для загрузки. Файлы должны находиться в папках в корневом каталоге в кэше ClickOnce, который занимает приложение XBAP. Настройку в приложении Visual Studio можно выполнить посредством следующих действий.

  1. Щелкните правой кнопкой мыши проект XBAP, выберите Свойства, Публикация и затем — Файлы приложений.

  2. В диалоговом окне Файлы приложений установите для параметра Состояние публикации каждого конвейера и библиотеки DLL надстройки значение Включить (Авто) и для параметра Группа загрузки каждого конвейера и библиотеки DLL — значение (обязательный).

Использование конвейера и надстройки из базовой папки приложения

Если конвейер и надстройка настроены для развертывания ClickOnce, они загружаются в ту же папку кэша ClickOnce, что и XBAP. Для того чтобы использовать конвейер и надстройку из приложения XBAP, код XBAP должен получить их из базовой папки приложения. Различные типы и члены модели надстройки .NET Framework предоставляют отдельную поддержку этого скрипта для использования конвейеров и надстроек. Сначала путь определяется значением перечисления ApplicationBase. Используйте это значение с перегрузками соответствующих членов надстройки для использования конвейеров, которые включают следующие члены:

Доступ к узлу источника

Чтобы убедиться, что надстройка может ссылаться на файлы узла источника, она должна быть загружена с изоляцией безопасности, которая соответствует ведущему приложению. Этот уровень безопасности определяется значением перечисления AddInSecurityLevel.Host и передается методу Activate при активации надстройки.

Архитектура надстройки WPF

Как видно, на самом высоком уровне WPF позволяет надстройкам .NET Framework реализовать несколько пользовательских интерфейсов UIs (которые являются прямо или косвенно производными от объекта FrameworkElement) посредством объекта INativeHandleContract и методов ViewToContractAdapter и ContractToViewAdapter. В результате, ведущее приложение возвращает объект FrameworkElement, который отображается из пользовательского интерфейса UI в ведущем приложении.

Для простых скриптов надстройки UI эти сведения достаточны для требований разработчика. Что касается более сложных сценариев, в частности, тех, в которых предпринимается попытка использовать дополнительные службы WPF, например макет, ресурсы и привязку данных, для понимания их преимуществ и ограничений необходимы более подробные сведения о том, как WPF расширяет модель надстройки .NET Framework с поддержкой UI.

В действительности приложение WPF не передает UI из надстройки в ведущее приложение; вместо этого WPF передает дескриптор окна Win32 для UI, используя взаимодействие WPF. По существу, когда UI передается из надстройки в ведущее приложение, происходит следующее.

  • На стороне надстройки приложение WPF получает дескриптор окна для пользовательского интерфейса UI, который будет отображен ведущим приложением. Дескриптор окна инкапсулируется внутренним классом WPF, производным от объекта HwndSource, и реализует объект INativeHandleContract. Экземпляр этого класса возвращается с помощью метода ViewToContractAdapter и маршалируется из домена приложения надстройки в домен ведущего приложения.

  • На стороне ведущего приложения WPF повторно пакетирует объект HwndSource как внутренний класс WPF, производный от объекта HwndHost, и принимает класс INativeHandleContract. Экземпляр этого класса возвращается в ведущее приложение посредством метода ContractToViewAdapter.

Класс HwndHost существует для отображения нескольких пользовательских интерфейсов UIs, определенных дескриптором окна, из интерфейсов UIs приложения WPF. Дополнительные сведения см. в разделе Взаимодействие WPF и Win32.

Таким образом, объект INativeHandleContract и методы ViewToContractAdapter и ContractToViewAdapter существуют для того, чтобы разрешить дескриптору окна передать пользовательский интерфейс UI приложения WPF из надстройки в ведущее приложение, где он инкапсулируется объектом HwndHost и отображает пользовательский интерфейс UI ведущего приложения.

ПримечаниеПримечание

Поскольку ведущее приложение получает объект HwndHost, оно не может объект, возвращаемый с помощью метода ContractToViewAdapter, преобразовать в тип, в котором он реализуется надстройкой (например, UserControl).

По своему типу, объект HwndHost имеет определенные ограничения, которые влияют на то, как ведущие приложения могут их использовать. Тем не менее приложение WPF расширяет объект HwndHost несколькими возможностями для сценариев надстройки. Эти преимущества и ограничения описаны ниже.

Преимущества надстроек WPF

Поскольку пользовательские интерфейсы UIs надстройки WPF отображаются из ведущих приложений посредством внутреннего класса, производного от объекта HwndHost, эти интерфейсы UIs ограничены возможностями объекта HwndHost по отношению к таким службам UI WPF, как макет, визуализация, привязка данных, стили, шаблоны и ресурсы. Однако WPF дополняет свой внутренний подкласс HwndHost вспомогательными возможностями, включая следующие.

  • Переход между компонентом UI ведущего приложения и компонентом UI надстройки. Обратите внимание, что для модели программирования "надстройка является UI", требуется адаптер на стороне надстройки для переопределения метода QueryContract, чтобы включить переход с учетом того, обладает ли надстройка полным или частичным доверием.

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

  • Включение приложений WPF для безопасной работы в нескольких скриптах домена приложений.

  • Предотвращение незаконного доступа к дескрипторам окна UI надстройки, когда надстройка запущена в режиме изоляции безопасности (то есть в режиме безопасности с частичным доверием "песочница"). Вызов метода ViewToContractAdapter гарантирует следующую безопасность.

    • Для модели программирования "надстройка возвращает UI" единственным способом передачи дескриптора окна для UI надстройки через границу изоляции является вызов метода ViewToContractAdapter.

    • Для модели программирования "надстройка является UI" требуется переопределение метода QueryContract в адаптере на стороне надстройки и вызов метода ViewToContractAdapter (как показано в предыдущем примере), как при вызове реализации QueryContract адаптера на стороне надстройки из адаптера на стороне узла.

  • Предоставление множественной защиты выполнения домена приложения. Вследствие ограничений доменов приложений, необработанные исключения, которые создаются в надстройке доменов приложений, вызывают сбой всего приложения, даже если существует граница изоляции. Однако WPF и модель надстройки .NET Framework предоставляют простой способ для решения этой проблемы и повышения стабильности работы приложения. Надстройка WPF, которая отображает UI, создает объект Dispatcher для потока, в котором выполняется домен приложения, если ведущим приложением является приложение WPF. Можно обнаружить все необработанные исключения, возникающие в домене приложения, обрабатывая событие UnhandledException объекта Dispatcher надстройки WPF. Объект Dispatcher можно получить из свойства CurrentDispatcher.

Ограничения надстройки WPF

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

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

  • Концепция airspace в скриптах взаимодействия также применяется к надстройкам (см. Общие сведения об областях применения технологий).

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

  • Пользовательский интерфейс UI надстройки не может быть повернут, масштабирован, наклонен или преобразован иным способом (см. Общие сведения о классах Transform).

  • Содержимое внутри UIs надстройки, которое отображено посредством рисования из пространства имен System.Drawing, может включать альфа-смешение. Однако UI надстройки и UI ведущего приложения, которое содержит этот интерфейс, должны быть на 100 % непрозрачны; другими словами, свойство Opacity обоих пользовательских интерфейсов должно иметь значение 1.

  • Если свойство AllowsTransparency окна в ведущем приложении, которое содержит UI надстройки, имеет значение true, надстройка будет невидимой. Это верно даже в том случае, если пользовательский интерфейс UI надстройки на 100% непрозрачен (то есть свойство Opacity имеет значение 1).

  • Пользовательский интерфейс UI надстройки должен отображаться в верхней части других элементов WPF в том же окне верхнего уровня.

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

  • Файлы мультимедиа невозможно воспроизвести из объекта MediaElement в UI надстройки.

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

  • При перемещении фокуса между элементами управления в пользовательском интерфейсе UI надстройки событий GotFocus и LostFocus не могут быть получены или вызваны ведущим приложением.

  • Часть ведущего приложения, которая содержит UI надстройки, будет пустым пространством при печати.

  • Все диспетчеры (см. Dispatcher), созданные пользовательским интерфейсом UI надстройки, должны быть вручную отключены, перед тем как надстройка владельца будет отправлена, если ведущее приложение продолжает выполняться. Контракт может реализовать методы, позволяющие ведущему приложению оповещать надстройку, перед тем как надстройка будет отправлена, тем самым позволяя UI надстройки завершить работу своих диспетчеров.

  • Если пользовательский интерфейс UI надстройки является объектом InkCanvas или содержит объект InkCanvas, разгрузка надстройки невозможна.

Оптимизация производительности

По умолчанию, при использовании нескольких доменов приложений, все сборки .NET Framework, необходимые для каждого приложения, загружаются в домен приложения. В результате, время, необходимое для создания новых доменов приложений и запуска в них приложений, может влиять на производительность. Однако компонент .NET Framework предоставляет способ сократить время запуска посредством инструктирования приложений для совместного использования сборок доменами приложений, если они уже загружены. Это можно выполнить с помощью атрибута LoaderOptimizationAttribute, который должен быть применен к методу точки входа (Main). В этом случае, необходимо использовать только код для реализации определения приложения (см. Общие сведения об управлении приложением).

См. также

Ссылки

LoaderOptimizationAttribute

Основные понятия

Надстройки и расширения среды

Домены приложений

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

.NET Framework Remoting Overview

Making Objects Remotable

Практические руководства