Главная » Silverlight » Сборки библиотечных классов

0

До сих пор во всех примерах книги код был размещен в одной сборке. Такой способ размещения кода оптимален для небольших приложений Silverlight. Однако часть кода можно разместить также в отдельной библиотечной сборке. Обычно библиотеки при­меняют для повторного использования кода в нескольких приложениях Silverlight, но иногда код размещают отдельно лишь для того, чтобы с ним можно было работать от­дельно от приложения. Такой прием обычно используется, когда приложение создается разными командами разработчиков.

Создать библиотеку классов Silverlight несложно. Фактически она создается так же, как библиотечная сборка обычного приложения .NET. Сначала создайте в рабочей среде Visual Studio новый проект на основе шаблона Silverlight Class Library (Библиотека клас­сов Silverlight). Затем добавьте в приложение Silverlight ссылку на него или на библио­течную сборку. Зависимая сборка будет автоматически скопирована в архив ХАР при компиляции приложения.

Использование ресурса в сборке

Библиотеки классов предоставляют удобный способ совместного использования ре­сурсов разными приложениями. Ресурс можно внедрить в библиотеку классов, а затем извлечь в самом приложении. Использовать эту методику легко, нужно лишь правильно создать адрес URI. Для извлечения ресурса из библиотеки адрес URI в приложении дол­жен быть записан в следующем формате.

/имя_библиотеки_кла ссов; component/имя_файла_ресурса

Похожий формат использовался выше, однако теперь в него внесено небольшое из­менение: адрес начинается с косой черты, представляющей корневую папку архива ХАР. Сначала адрес указывает на зависимую сборку в архиве ХАР, а затем — на ресурс в сборке.

В качестве примера рассмотрим сборку ResourceClassLibrary (рис. 6.14). Она со­держит ресурс happyface.jpg, встроенный в сборку путем присвоения свойству Build Action значения Resource.

Рис. 6.14. Ресурс happyface.jpg в файле ХАР

Ниже приведена разметка элемента Image, в котором используется ресурс happy­face.jpg, хранящийся в библиотеке классов.

cimage Source=

"/ResourceClassLibrary;component/happyface.jpg"> </Image>

Загрузка сборки по требованию

В некоторых случаях код библиотеки классов используется редко, а частью поль­зователей он вообще не используется. Иногда библиотека классов содержит большой объем кода или (что более вероятно) большие файлы ресурсов (например, рисунки). Включение библиотеки в приложение приведет к увеличению размеров файла ХАР и вре­мени загрузки. В таких случаях рекомендуется создать отдельную сборку, загружаемую только при необходимости. Данный сценарий похож на загрузку ресурса по требованию. Ресурс размещен в отдельном файле за пределами файла ХАР, но на том же сайте.

Необходимо убедиться в том, что зависимая сборка случайно не попала в файл ХАР. Для этого выделите в окне решений ссылку на сборку и в окне свойств установите для свойства Copy Local значение false. Затем убедитесь в том, что сборка скопирована в то же место, что и сайт. Если используется тестовый сайт ASP.NET, сборка должна быть скопирована в папку ClientBin. Выполнить приведенный ниже пример с помощью тестовой страницы HTML не удастся, потому что при запуске приложения Silverlight не­посредственно из файловой системы класс WebClient не работает.

Для загрузки сборки по требованию используются классы WebClient и AssemblyPart. Класс WebClient извлекает сборку, а класс AssemblyPart делает ресурс доступным для использования.

string uri = Application.Current.Host.Source.AbsoluteUri; int index = uri.IndexOf("/ClientBin");

// Адрес URI содержит фрагмент /ClientBin, потому что // библиотека DLL находится в папке ClientBin uri = uri.Substring (0, index) +

"/ClientBin/ResourceClassLibrary.dll";

// Начало загрузки

WebClient webClient = new WebClient ();

webClient.OpenReadCompleted += webClient_OpenReadCompleted; webClient.OpenReadAsync(new Uri(uri)) ;

Когда сборка загружена, метод AssemblyPart.LoadO используется для ее загрузки в домен текущего приложения.

private void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)

{

if (e.Error != null) {

// Сюда нужно добавить код, выводящий сообщение об // ошибке или выполняющий плавную деградацию

}

else {

AssemblyPart assemblypart = new AssemblyPart (); assemblypart.Load(e. Result);

}

}

После этого можно извлечь ресурс из сборки и создать на его основе экземпляры нужных типов. Дальше все происходит так, будто содержимое сборки было частью фай­ла ХАР с самого начала. Выполнить данный пример можно с помощью кода, прилагае­мого к главе 6.

Необходимо отслеживать, загружалась ли сборка, чтобы не тратить время на по­вторную загрузку. Это особенно важно в приложениях, в которых используются вет­вящиеся цепочки сборок: приложение загружает сборку по требованию, она загружает дополнительные сборки, которые в свою очередь могут загружать другие сборки, и т.д.

Совет. Если попытаться использовать незагруженную сборку, будет сгенерировано исключение. Однако оно генерируется не в коде, попытавшемся использовать сборку. Этот код игнорируется, а исключение передается обработчику события Application. UnhandledException. Исключение представляется объектом FileNotFoundException, а сообщение содержит имя недостающей сборки.

Источник: Мак-Дональд, Мэтью. Silverlight 3 с примерами на С# для профессионалов. : Пер. с англ. —- М. : ООО «И.Д. Вильяме», 2010. — 656 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии