Программирование >>  Дополнения add-ins 

1 [ 2 ] 3 4 5 ... 7


дения дополнений и других сборок канала. Компоненты канала должны располагаться в следующих каталогах:

□ HostSideAdapters

□ Contracts

□ AddlnSideAdapters

□ AddlnViews

□ Addlns


Рис. 36.2. Отношения мжду классами канала

Все эти каталоги, за исключением Addlns, непосредственно содержат сборку определенной части канала. Каталог Addlns содержит подкаталоги для каждой сборки дополнения. Также можно хранить их в каталогах, полностью независимых от других компонентов канала.

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

Кэшированная информация о компонентах канала создается вызовами методов класса AddlnStore. Метод Update() находит новую сборку, которая еще не указана в списке хранилища. Метод Rebuild() перестраивает полностью двоичный файл хранилища с информацией о дополнениях. В табл. 36.2 перечислены методы класса AddInStore.

Активизация и изоляция

Метод FindAddIns() класса AddInStore возвращает коллекцию объектов AddInToken, представляющую дополнение. Через класс AddInToken вы можете получить доступ к информации о сборке - такой как имя, описание, издатель и версия. Вы можете активизировать дополнения методом Activate() . В табл. 36.3 перечислены свойства и методы класса AddInToken.



Таблица 36.2. Методы класса AddlnStore

Члены

AddlnStore

Update() UpdateAddIns()

FindAddIn() FindAddIns()

Описание

Rebuild() RebuildAddIns()

Метод Rebuild() перестраивает кэш со всеми компонентами канала. Если дополнение хранится в другом каталоге, то метод RebuildAddIns() может быть использован для перестройки кэша дополнений.

В то время как метод Rebuild() перестраивает целиком кэш канала, метод Update() просто обновляет кэш информацией о новых компонентах канала. Метод UpdateAddIns() обновляет только кэш дополнений.

Эти методы используются для нахождения дополнений с использованием кэша. Метод FindAddIns() возвращает коллекцию всех дополнений, которые соответствуют представлению хоста. Метод FindAddIns() возвращает определенное дополнение.

Таблица 36.3. Свойства и методы класса AddlnToken

Член

AddlnToken

QualificationData

Activate()

Описание

Name

Publisher

Version

Description

AssemblyName EnableDirectConnect

Свойства Name, Publisher, Version и Description класса AddInToken возвращают информацию о дополнении, которая присваивается дополнению атрибутом AddInAttribute.

AssemblyName возвращает имя сборки, содержащей дополнение.

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

Дополнение может пометить домен приложения и требования безопасности атрибутом QualificationDataAttribute. Дополнение может перечислять требования к безопасности и изоляции.

Например, [QualificationData( Isolation , NewAppDomain )] означает, что дополнение должно быть размещено в новом процессе. Вы можете прочесть эту информацию из AddInToken для активизации дополнения со специфицированными требованиями. В дополнение к требованиям домена приложений и безопасности, вы можете использовать этот атрибут для передачи специальной информации по каналу.

Дополнение активизируется методом Activate() . С параметрами этого метода вы можете определить, должно ли дополнение загружаться внутри нового домена приложения или нового процесса. Вы можете также определить привилегии, которые получит дополнение.

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

Метод Activate() класса AddInToken имеет несколько перегрузок, которым вы можете передать среду, куда желаете загрузить дополнение. Допустимые варианты перечислены в табл. 36.4.



Таблица 36.4. Параметры метода AddlnToken.Activate() Параметр Описание

AddInToken.Activate() Описание

AppDomain

AddInSecurityLevel

PermissionSet

AddInProcess

AddInEnvironment

Вы можете передать новый домен приложения, в который должно быть загружено дополнение. Таким образом, вы можете сделать его независимым от хост-приложения и, кроме того, оно может быть затем выгружено этим доменом приложения.

Если дополнение должно быть запущено с другими уровнями безопасности, вы можете передать значение перечисления AddInSecurityLevel. Возможные значения - Internet, Intranet, FullTrust и Host.

Если предопределенные уровни безопасности недостаточно специфичны, вы можете также присвоить PermissionSet домену приложения дополнения.

Дополнение также может быть запущено внутри другого процесса принимающего хост-приложения. Вы можете передать новый AddInProcess методу Activate(). Новый процесс может завершиться, когда все дополнения выгружены, или продолжать выполнение. Эта опция, которая может быть установлена свойством KeepAlive.

Передача объекта AddInEnvironment - еще один вариант определения домена приложения, куда должно быть загружено приложение. Конструктору AddInEnvironment вы можете передать объект AppDomain. Можно также получить существующий

AddInEnvironment дополнения из свойства AddInEnvironment

класса AddInController.

Домены приложений описаны в главе 17.

Тип приложения может ограничивать ваш выбор. Дополнения WPF не поддерживают пересекающиеся процессы. С Windows Forms невозможно иметь элементы управления Windows, подключаемые из разных доменов приложений.

Ниже перечислены шаги, выполняемые при вызове метода Activate() объекта AddInToken.

1. Создается домен приложения с указанными привилегиями.

2. Сборка дополнения загружается в новый домен приложения методом Assembly.

LoadFrom() .

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

4. Далее конструируется экземпляр адаптера стороны дополнения. Экземпляр дополнения передается конструктору адаптера, так что адаптер может подключить контракт к дополнению. Адаптер дополнения наследуется от базового класса MarshalByRefObject, так что он может вызываться через границы доменов приложений.

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



1 [ 2 ] 3 4 5 ... 7

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика