Общие сведения о надстройках WPF
.NET Framework включает модель надстроек, разработчики могут использовать для создания приложений, поддерживающих расширяемость надстроек. Эта модель позволяет создавать надстройки, которые интегрируются с функциональностью приложения и расширяют ее. В некоторых сценариях приложения также должны отображать пользовательские интерфейсы, которые предоставляются надстройками. В этом разделе показано, как WPF расширяет модель надстроек платформы .NET Framework для поддержки таких сценариев, архитектуры, его преимущества и ограничения.
Предварительные требования
Знание модели надстроек платформы .NET Framework является обязательным. Дополнительные сведения см. в разделе Надстройки и расширяемость.
Общие сведения о надстройках
Чтобы избежать сложностей повторной компиляции и развертывания приложений для включения новых функциональных возможностей, приложения реализуют механизмы расширяемости, которые позволяют разработчикам (как собственным, так и сторонним) создавать другие приложения с поддержкой интеграции. Наиболее распространенным способом поддержки этого типа расширяемости является использование надстроек (также называемых "подключаемыми модулями"). Примеры реальных приложений, которые обеспечивают расширяемость с помощью надстроек:
Надстройки Internet Explorer.
Надстройки проигрывателя Windows Media.
Надстройки Visual Studio.
Например, модель надстроек проигрывателя Windows Media позволяет сторонним разработчикам реализовать "подключаемые модули", расширяющие возможности проигрывателя Windows Media различными способами, включая создание декодеров и кодировщиков для форматов мультимедиа, изначально не поддерживаемых проигрывателем Windows Media (например: DVD, MP3), а также звуковых эффектов и обложек. Каждая модель надстройки создается для предоставления функций, уникальных для приложения, хотя существует несколько элементов и поведений, общих для всех моделей.
Тремя основными сущностями типичных решений расширяемости являются контракты, надстройки и ведущие приложения. Контракты определяют интеграцию надстроек с ведущими приложениями двумя способами:
Надстройки интегрируются с функциональными возможностями, реализуемыми ведущими приложениями.
Ведущие приложения предоставляют функциональные возможности для надстроек, с которыми интегрируются.
Чтобы использовать надстройки, ведущие приложения должны найти их и загрузить во время выполнения. Следовательно, приложения, поддерживающие надстройки, имеют следующие дополнительные обязанности:
Обнаружение: Поиск надстроек, которые соответствуют контрактам, поддерживаемым ведущими приложениями.
Активация: Загрузка, запуск и установка связи с надстройками.
Изоляция: Использование доменов приложений или процессов для установления границ изоляции, защищающих приложения от потенциальных безопасности и выполнения проблем с надстройками.
Обмен данными: Разрешение надстройкам и ведущим приложениям взаимодействовать друг с другом через границы изоляции путем вызова методов и передачи данных.
Управление жизненным циклом: Загрузка и выгрузка доменов приложений и процессов ясным, прогнозируемым способом (см. в разделе домены приложений).
Управление версиями: Проверка того, что размещать приложения и надстройки могут взаимодействовать при создании новых версий.
В конечном счете разработка надежной модели надстройки является нетривиальный задачей. По этой причине .NET Framework предоставляет инфраструктуру для построения моделей надстроек.
Note
Более подробные сведения о надстройках см. в разделе Надстройки и расширения среды.
Общие сведения о модели надстроек платформы .NET Framework
Добавить в модель, найден в System.AddIn пространство имен, содержит набор типов, которые предназначены для упрощения разработки расширяемости. Основной единицей модели надстроек платформы .NET Framework является контракта, который определяет, как ведущее приложение и надстройка взаимодействуют друг с другом. Контракт предоставляется ведущему приложению с помощью специфичного для ведущего приложения представления контракта. Аналогичным образом надстройке предоставляется специфичное для нее представление контракта. Адаптер позволяет ведущему приложению и надстройке обмениваться данными между соответствующими представлениями контракта. Контракты, представления и адаптеры называются сегментами, а набор связанных сегментов составляет конвейер. Конвейеры — это основа, на которой модель надстроек платформы .NET Framework поддерживает обнаружение, активации, изоляции и безопасности, изоляцию выполнения (с использованием доменов приложений и процессов), обмен данными, управление жизненным циклом и управление версиями.
Эта поддержка в целом позволяет разработчикам создавать надстройки, которые интегрируются с функциональностью ведущего приложения. Однако в некоторых сценариях требуется ведущее приложение должно отображать интерфейс пользователя надстройки. Поскольку каждая технология представления в .NET Framework имеет свою собственную модель для реализации пользовательских интерфейсов, модель надстроек платформы .NET Framework не поддерживает любой определенную технологию представления. Вместо этого WPF расширяет модель надстроек платформы .NET Framework с поддержкой пользовательского интерфейса для надстройки.
Надстройки WPF
WPF, в сочетании с .NET Framework модель надстроек, позволяет решить широкий спектр сценариев, требующих ведущее приложение отображало пользовательских интерфейсов из надстройки. В частности эти сценарии реализованы в WPF с помощью следующих двух моделей программирования:
Надстройка возвращает пользовательский интерфейс. Надстройка возвращает пользовательский Интерфейс ведущему приложению с помощью вызова метода, как определено в контракте. Этот сценарий используется в следующих случаях.
Внешний вид пользовательского интерфейса, который возвращается надстройке зависит от данных или условий, которые существуют только во время выполнения, такие как динамически создаваемые отчеты.
Пользовательский Интерфейс для службы, предоставляемые надстройки отличается от ведущих приложений, которые можно использовать надстройки пользовательского интерфейса.
Надстройки в основном выполняет службу для ведущего приложения и сообщает о состоянии ведущему приложению с пользовательским Интерфейсом.
Надстройка — это пользовательский интерфейс. Надстройка является пользовательским Интерфейсом, как определено в контракте. Этот сценарий используется в следующих случаях.
Надстройка не предоставляет службы помимо отображения, например рекламного объявления.
Пользовательский Интерфейс для службы, предоставляемые надстройки являются общими для всех ведущих приложений, которые могут использовать эту надстройку, например калькулятор или палитру цветов.
Эти сценарии требуют, что объекты пользовательского интерфейса могут передаваться между ведущим приложением и доменами приложений надстроек. Поскольку платформа .NET Framework, модель надстроек использует удаленное взаимодействие между доменами приложений объекты, которые передаются между ними должны поддерживать удаленную обработку.
Объект, поддерживающий удаленную обработку, является экземпляром класса, который выполняет одну или несколько из следующих функций:
Является производным от MarshalByRefObject класса.
Реализует интерфейс ISerializable.
Имеет SerializableAttribute применен атрибут.
Note
Дополнительные сведения о создании объектов удаленного взаимодействия .NET Framework, см. в разделе внесения поддержки удаленного взаимодействия объектами.
Типы пользовательского интерфейса WPF, не поддерживающие удаленное взаимодействие. Чтобы решить проблему, WPF расширяет модель надстроек платформы .NET Framework для включения пользовательского интерфейса WPF созданные надстройки для отображения из ведущих приложений. Эта поддержка обеспечивается WPF с двух типов: INativeHandleContract интерфейс и два статических метода, реализуемый FrameworkElementAdapters класса: ContractToViewAdapter и ViewToContractAdapter. На высоком уровне эти типы и методы используются следующим образом:
Технология WPF требует, что пользовательские интерфейсы, предоставляемые надстройки являются классами, которые прямо или косвенно наследующие от FrameworkElement, таких как фигуры, элементы управления, пользовательские элементы управления, панели макета и страницы.
Везде, где в контракте объявляется, что пользовательский Интерфейс будет передаваться между надстройкой и ведущим приложением, он должен быть объявлен как INativeHandleContract (не FrameworkElement); INativeHandleContract является удаленным представлением надстройки пользовательского интерфейса, могут передаваться через границы изоляции.
Перед передачей из домена приложения надстройки FrameworkElement входит в состав INativeHandleContract путем вызова ViewToContractAdapter.
После передачи домен приложения ведущего приложения, INativeHandleContract нужно упаковать в FrameworkElement путем вызова ContractToViewAdapter.
Как INativeHandleContract, ContractToViewAdapter, и ViewToContractAdapter используются зависит от конкретного сценария. В следующих разделах содержатся сведения о каждой модели программирования.
Надстройка возвращает пользовательский интерфейс
Для надстройки для возврата пользовательского интерфейса ведущего приложения необходимы следующие компоненты:
Ведущее приложение, надстройка и конвейер должны создаваться, как описано в .NET Framework надстройки и расширения документации.
Контракт должен реализовывать IContract и, чтобы вернуть пользовательского интерфейса, контракт должен быть объявлен метод с возвращаемым значением типа INativeHandleContract.
Пользовательский Интерфейс, который передается между надстройкой и ведущим приложением должен прямо или косвенно быть производным от FrameworkElement.
Пользовательский Интерфейс, который возвращается методом надстройка должна быть преобразована из FrameworkElement для INativeHandleContract перед пересечением границы изоляции.
Пользовательский Интерфейс, который возвращается должны преобразовываться из INativeHandleContract для FrameworkElement после пересечения границы изоляции.
Ведущее приложение отображает возвращаемый FrameworkElement.
Пример, демонстрирующий реализацию надстройки, возвращающей пользовательский Интерфейс, см. в разделе создание надстройки, возвращающей пользовательский Интерфейс.
Надстройка является пользовательским интерфейсом
Если надстройка является пользовательским Интерфейсом, необходимы следующие компоненты:
Ведущее приложение, надстройка и конвейер должны создаваться, как описано в .NET Framework надстройки и расширения документации.
Интерфейс контракта для надстройки должен реализовывать INativeHandleContract.
Надстройка, которая передается ведущему приложению должен прямо или косвенно быть производным от FrameworkElement.
Надстройка должна быть преобразована из FrameworkElement для INativeHandleContract перед пересечением границы изоляции.
Надстройка должна быть преобразована из INativeHandleContract для FrameworkElement после пересечения границы изоляции.
Ведущее приложение отображает возвращаемый FrameworkElement.
Пример, демонстрирующий реализацию надстройки, являющейся пользовательским Интерфейсом, см. в разделе надстройка — то есть создание пользовательского интерфейса.
Возвращение нескольких пользовательских интерфейсов из надстройки
Надстройки часто предоставляют несколько пользовательских интерфейсов для отображения ведущими приложениями. Например рассмотрим надстройки, являющейся пользовательским Интерфейсом, которая предоставляет сведения о состоянии ведущему приложению, также как пользовательский Интерфейс. Такие надстройки можно реализовать с помощью сочетания методов из моделей Надстройка возвращает пользовательский интерфейс и Надстройка является пользовательским интерфейсом.
Надстройки и приложения браузера XAML
В приведенных примерах ведущее приложение было установленным автономным приложением. Однако XAML-приложения браузера (XBAP) также может размещать надстройки, хотя при этом применяются следующие дополнительные требования к сборке и реализации.
Манифест приложения XBAP должен быть настроен специально для загрузки конвейера (папок и сборок) и сборки надстройки в кэш приложения ClickOnce на клиентской машине в той же папке, где находится XBAP.
Код XBAP для обнаружения и загрузки надстроек должен использовать кэш приложения ClickOnce для XBAP в качестве расположения конвейера и надстройки.
XBAP должен загрузить надстройку в специальный контекст безопасности, если надстройка ссылается на свободные файлы, расположенные на исходном узле. Если они размещаются в XBAP, надстройки могут ссылаться только на свободные файлы, расположенные на исходном узле ведущего приложения.
Эти задачи подробно описаны в следующих подразделах.
Настройка конвейера и надстройки для развертывания ClickOnce
XBAP скачиваются и запускать из безопасную папку в ClickOnce кэше развертывания. Для размещения надстройки в XBAP конвейер и сборка надстройки также должны быть загружены в безопасную папку. Для этого нужно настроить манифест приложения для включения и конвейера и сборки надстройки для загрузки. Проще всего это сделать в Visual Studio, хотя сборка конвейера и надстройки должна находиться в корневой папке проекта XBAP, чтобы Visual Studio мог обнаружить сборочные узлы конвейера.
Следовательно, первый шаг — создать сборку конвейера и надстройки в корне проекта XBAP, настроив выходные данные построения для каждого проекта сборки конвейера и сборки надстройки. В следующей таблице показаны выходные пути построения для проектов сборки конвейера и проекта сборки надстройки, которые находятся в том же решении и корневой папке, что и проект ведущего приложения XBAP.
Таблица 1. Создание выходных путей построения для сборок конвейера, размещенных в XBAP
Проект сборки конвейера | Выходной путь сборки |
---|---|
Контракт | ..\HostXBAP\Contracts\ |
Представление надстройки | ..\HostXBAP\AddInViews\ |
Адаптер надстройки | ..\HostXBAP\AddInSideAdapters\ |
Адаптер приложения | ..\HostXBAP\HostSideAdapters\ |
Надстройка | ..\HostXBAP\AddIns\WPFAddIn1 |
Следующим шагом является указание сборок конвейера и сборки надстройки как файлов содержимого XBAP в Visual Studio следующим образом.
Включение сборки конвейера и надстройки в проект. Для этого следует щелкнуть правой кнопкой мыши каждую папку конвейера в обозревателе решений и выбрать вариант Включить в проект.
Установка для Действия при построении для каждой сборки конвейера и надстройки значения Содержимое в окне Свойства.
Последним шагом является настройка манифеста приложения для включения файлов сборки конвейера и файла сборки надстройки для загрузки. Файлы должны располагаться в папках в корне папки в кэше ClickOnce, занимаемом приложением XBAP. Эта конфигурация может реализовываться в Visual Studio следующим образом:
Щелкните правой кнопкой мыши проект XBAP, выберите Свойства, Публиковать, а затем нажмите кнопку Файлы приложения.
В диалоговом окне Файлы приложения установите для параметра Состояния публикации каждой DLL конвейера и надстройки значение Включить (авто), а для Группы загрузки для каждой DLL конвейера и надстройки — значение (обязательно).
Использование конвейера и надстройки из базовой папки приложения
Если конвейер и надстройка настроены для развертывания ClickOnce, они загружаются в ту же папку кэша ClickOnce, что и XBAP. Чтобы использовать конвейер и надстройку из XBAP, код XBAP должен получить их из базовой папки приложения. Различные типы и члены модели надстроек платформы .NET Framework для использования конвейеров и надстроек обеспечивают специальную поддержку для этого сценария. Во-первых, определяется путь ApplicationBase значение перечисления. Это значение используется при перегрузках соответствующих элементов надстройки для использования конвейеров, которые включают следующее:
Доступ к исходному узлу ведущего приложения
Чтобы надстройка могла ссылаться на файлы с исходного узла, она должна быть загружена с изоляцией безопасности, эквивалентной ведущему приложению. Этот уровень безопасности определяется AddInSecurityLevel.Host значение перечисления и передается Activate метод при активации надстройки.
Архитектура надстроек WPF
На самом высоком уровне, как мы уже видели, WPF включает надстроек .NET Framework для реализации пользовательских интерфейсов (который непосредственно или косвенно наследующие от FrameworkElement) с помощью INativeHandleContract, ViewToContractAdapter и ContractToViewAdapter. Результатом является то, что ведущее приложение возвращается FrameworkElement , отображаемыми в пользовательском Интерфейсе в ведущем приложении.
Для простых сценариев пользовательского интерфейса надстройки это максимально подробно, достаточно для разработчиков. Для более сложных сценариев, особенно тех, которые пытаются использовать дополнительных служб WPF, таких как макет, ресурсы и привязки данных, необходимо понять ее преимущества более подробная информация о том, как WPF расширяет модель надстроек платформы .NET Framework с поддержкой пользовательского интерфейса и ограничения.
По существу WPF не передавать пользовательского интерфейса из надстройки в ведущее приложение. Вместо этого WPF передает дескриптор окна Win32 для пользовательского интерфейса с помощью взаимодействие с WPF. Таким образом когда пользовательский Интерфейс из надстройки передается в ведущее приложение, происходит следующее:
На стороне надстройки WPF Получает дескриптор окна для пользовательского интерфейса, который будет отображаться ведущим приложением. Дескриптор окна инкапсулируется внутренний класс WPF, который является производным от HwndSource и реализует INativeHandleContract. Экземпляр этого класса возвращается с ViewToContractAdapter и упаковывается из домена приложения надстройки в домен приложения ведущего приложения.
На стороне ведущего приложения WPF переупаковывает HwndSource как внутренний класс WPF, который является производным от HwndHost и использует INativeHandleContract. Экземпляр этого класса возвращается с ContractToViewAdapter ведущему приложению.
HwndHost существует для отображения пользовательских интерфейсов, определенных с помощью дескрипторов окон, пользовательских интерфейсах WPF. Более подробную информацию см. в разделе Взаимодействие WPF и Win32.
Таким образом INativeHandleContract, ViewToContractAdapter, и ContractToViewAdapter позволяют использовать дескриптор окна для пользовательского интерфейса, WPF, передается из надстройки в ведущее приложение, где он инкапсулируется HwndHost и отображения пользовательского интерфейса ведущего приложения.
Note
Поскольку ведущее приложение получает HwndHost, ведущее приложение не может преобразовать объект, который возвращается методом ContractToViewAdapter к типу она реализуется как надстройки (например, UserControl).
По своей природе HwndHost имеет определенные ограничения, которые влияют на то, как ведущие приложения могут их использовать. Тем не менее, расширяет WPF HwndHost несколькими возможностями для сценариев надстройки. Эти преимущества и ограничения описаны ниже.
Преимущества надстройки WPF
Поскольку надстройка пользователя интерфейсов WPF отображаются из ведущих приложений, используя внутренний класс, производный от HwndHost, эти пользовательские интерфейсы, ограничены возможности HwndHost с точки зрения службы пользовательского интерфейса WPF, такие как макет, отрисовки, привязка данных, стили, шаблоны и ресурсы. Тем не менее, дополняет свой внутренний WPF HwndHost подкласс дополнительными возможностями, которые включают следующее:
Переход между пользовательского интерфейса ведущего приложения и надстройки пользовательского интерфейса. Обратите внимание, что модель программирования «надстройка является пользовательским Интерфейсом» add-адаптер надстройки для переопределения QueryContract для поддержки переходов по табуляции надстройки полным доверием или с частичным доверием.
Учитывая требований по специальным возможностям для надстройки пользовательские интерфейсы, которые выводятся из пользовательских интерфейсов приложений узла.
Включение приложений WPF для безопасной работы в нескольких сценариях домена приложений.
Предотвращение незаконного доступа к интерфейс пользователя надстройки окно обрабатывает при запуске надстройки в режиме изоляции безопасности (то есть изолированной среде безопасности частичного доверия). Вызов ViewToContractAdapter гарантирует эту безопасность:
Для «Надстройка возвращает пользовательский Интерфейс» модель программирования, единственным способом передачи дескриптора окна для пользовательского интерфейса надстройки через границы изоляции является вызов ViewToContractAdapter.
Для «надстройка является пользовательским Интерфейсом» модель программирования Переопределяя QueryContract на адаптер на стороне надстройки и вызов ViewToContractAdapter (как показано в предыдущих примерах) является обязательным, так как вызывается адаптер на стороне надстройки
QueryContract
реализации от адаптер на стороне узла.
Предоставление защиты выполнения нескольких доменов приложений. Из-за ограничений, связанных с доменами приложений, необработанные исключения, которые появляются в доменах приложений надстроек, вызывают сбой всего приложения, несмотря на наличие границы изоляции. Тем не менее WPF и модель надстроек платформы .NET Framework предоставляют простой способ решения этой проблемы и повышают стабильность работы приложения. Надстройки WPF, который отображает пользовательский Интерфейс создает Dispatcher для потока, который выполняется домен приложения, если ведущее приложение является приложением WPF. Можно обнаружить все необработанные исключения, возникающие в домене приложения, обрабатывая UnhandledException события WPF надстройки Dispatcher. Вы можете получить Dispatcher из CurrentDispatcher свойство.
Ограничения надстройки WPF
Помимо преимуществ, WPF добавляет к поведениям по умолчанию, предоставляемые HwndSource, HwndHostи дескрипторами окон, существуют также ограничения для надстройки пользовательские интерфейсы, которые отображаются из ведущих приложений:
Добавьте в пользовательские интерфейсы, отображаемых из ведущего приложения не влияют на поведение при обрезке ведущего приложения.
Концепция свободного пространства в сценариях взаимодействия также применяется к надстройкам (см. Общие сведения о технологических областях).
Пользовательского интерфейса ведущего приложения служб, таких как наследование ресурса, привязка данных и команды, недоступны автоматически для пользовательских интерфейсов. Чтобы предоставить эти службы для надстройки, необходимо обновить конвейер.
Пользовательского интерфейса надстройки нельзя (повернутый), масштабировать, наклонять или в противном случае преобразование влияет (см. в разделе Общие сведения о преобразованиях).
Содержимое внутри надстройки пользовательские интерфейсы, которые визуализируется посредством операций из рисования System.Drawing пространство имен может включать альфа-смешение. Тем не менее пользовательского интерфейса надстройки и ведущего приложения пользовательского интерфейса, содержащего его должны быть 100% непрозрачный; Другими словами
Opacity
свойства должно быть установлено в 1.Если AllowsTransparency окна в ведущем приложении, содержащий пользовательский Интерфейс свойству
true
, надстройка невидим. Это справедливо, даже при 100% непрозрачный надстройке пользовательского интерфейса (то естьOpacity
свойство имеет значение 1).Пользовательского интерфейса надстройки должно появляться поверх других элементов WPF, в том же окне верхнего уровня.
Часть пользовательского интерфейса надстройки может визуализироваться с помощью VisualBrush. Вместо этого надстройка может сделать снимок произведенный пользовательский Интерфейс для создания точечного рисунка, который может быть передан в ведущее приложение, используя методы, определенные в контракте.
Файлы мультимедиа невозможно воспроизвести из MediaElement в пользовательском Интерфейсе.
События мыши, созданные для пользовательского интерфейса надстройки не получаются и не вызываются ведущим приложением и
IsMouseOver
свойство для ведущего приложения пользовательского интерфейса имеет значениеfalse
.Когда фокус перемещается между элементами управления в надстройке пользовательского интерфейса,
GotFocus
иLostFocus
события не получены, или вызывается ведущим приложением.Часть ведущего приложения, содержащий пользовательский Интерфейс выглядит пустой при печати.
Все диспетчеры (см. в разделе Dispatcher) созданные надстройки пользовательского интерфейса необходимо завершить работу вручную перед надстройка владельца будет выгружена, если ведущее приложение продолжит выполнение. Контракт может реализовывать методы, позволяющие ведущему приложению оповещать надстройку, прежде чем надстройка выгружается, тем самым позволяя надстройки пользовательского интерфейса, чтобы закрыть свои диспетчеры.
Если интерфейс пользователя надстройки InkCanvas или содержит InkCanvas, вы не сможете выгрузить надстройку.
Оптимизация производительности
По умолчанию при использовании нескольких доменов приложений различные сборки .NET Framework, необходимые для каждого приложения все загружаются в домен приложения. В результате время, необходимое для создания новых доменов приложений и запуска приложений в них, может повлиять на производительность. Тем не менее платформа .NET Framework предоставляет способ сократить время запуска, предписывая приложения для совместного использования сборок в доменах приложений, если они уже загружены. Это делается с помощью LoaderOptimizationAttribute атрибут, который должен применяться к методу точки входа (Main
). В данном случае необходимо использовать только код для реализации определения приложения (см. Общие сведения об управлении приложением).