Опубликован: 28.04.2009 | Доступ: свободный | Студентов: 1838 / 107 | Оценка: 4.36 / 4.40 | Длительность: 16:40:00
Специальности: Программист
Лекция 4:

Хранитель экрана

4.7.1. Использование Custom Actions

Технология Windows Installer, используемая Visual Studio, позволяет по завершению установки приложения запустить код из пользовательской сборки, выполняющий некоторые нестандартные действия. Данная функциональность получила называние Custom Actions.

Итак, давайте создадим сборку, которая будет изменять текущий хранитель экрана посредством утилиты rundll32. Для начала добавьте в решение проект сборки новой библиотеки с названием SetupCustomActions (команда контекстного меню Add | New Project… | Visual C# | Class Library ). Щелкните в окне Solution на узле сборки и добавьте класс инсталлятора SetCurrentScrenSaver (Add | New Item… | Installer Class) . В проект будет добавлен новый класс, наследник Installer (листинг 4.24).

using System;
using System.Collections.Generic;
using System.ComponentModel; using
System.Configuration.Install;
namespace SetupCustomActions 
{
// Атрибут RunInstaller, установленный в true, указывает на то, что данный класс будет 
// автоматически использоваться инсталлятором при установке приложения
[RunInstaller(true)]
public partial class SetCurrentScrenSaver : Installer 
{
public SetCurrentScrenSaver() 
{
InitializeComponent(); 
} 
} 
}
Листинг 4.24.

Класс Installer является каркасом, обеспечивающим базовую функциональность Custom Actions. Для добавления новых действий, выполняемых при инсталляции приложения, необходимо переопределить виртуальный метод Install класса Installer (листинг 4.25).

using System.Diagnostics;
public override void Install(System.Collections.IDictionary stateSaver) 
{
// Вызываем оригинальный метод класса Installer
base.Install(stateSaver);
// Вызываем утилиту rundll32
Process.Start("rundll32.exe", "desk.cpl,InstallScreenSaver
Context.Parameters["ScreenSaver"]); 
}
Листинг 4.25.

Информация о местоположении файла получается при помощи свойства Context.Parameters, содержащего ассоциативный массив параметров, переданных данной сборке (передачу параметров в сборку мы рассмотрим чуть ниже).

Скомпилируйте созданную библиотеку классов. Теперь нам необходимо включить полученную сборку в состав дистрибутива. Для этого в окне Solution щелкните правой кнопкой мыши на узле проекта установки ( Setup ) и выполните команду контекстного View | Custom Actions. Откроется окно редактора Custom Actions, содержащее иерархический список действий, которые выполняются при инсталляции приложения, деинсталляции, откате изменений и т.п. Щелкните правой кнопке на узле Install (действия, выполняемые при установке приложения) и выполните команду контекстного меню Add Custom Action…. В появившееся диалоговом окне необходимо выбрать папку, в которую будет скопирована сборка, реализующая Custom Actions. В нашем случае просто выберите в выпадающем списке в верхней части окна папку Application Folder (каталог, в который устанавливается приложение). Затем нажните кнопку Add Output…, и в выпадающем списке Project открывшегося окна выберите проект, содержащий сборку с Custom Actions (как вы помните, мы ее назвали SetupCustomActions ). Наконец, в списке в центральной области окна выберите элемент Primary output (файл, полученный после компиляции указанного проекта) и нажмите Ok (рисунок 4.13).

 Добавление в дистрибутив сборки, реализующей Custom Actions

увеличить изображение
Рис. 4.13. Добавление в дистрибутив сборки, реализующей Custom Actions

После выполнения вышеперечисленных действий в окне Custom Actions у элемента Install появится дочерний узел Primary output from SetupCustomActions (Active) . Ну а так как сборка SetupCustomActions содержит класс, производный от Installer, объявленный с атрибутом [RunInstaller(true)] , данный класс будет автоматически использоваться при инсталляции приложения. Правда, просто вызвать класс еще не достаточно – как вы помните, необходимо еще передать сборке параметр ScreenSaver с полным именем файла хранителя экрана. Для этого свойству CustomActionData узла Primary output from SetupCustomActions (Active) достаточно присвоить значение /ScreenSaver="[TARGETDIR]Firework XNA.scr" (рисунок 4.14).

 Задание параметров, передаваемых в сборку

увеличить изображение
Рис. 4.14. Задание параметров, передаваемых в сборку
4.7.2. Интеграция дистрибутивов .NET Framework 2.0 и XNA Framework 1.0

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

.NET Framework 2.0

XNA Framework 1.0.

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

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

Данная функциональность реализуется очень просто. Достаточно открыть свойства проекта инсталлятора (команда контекстного меню Properties ), нажать кнопку Prerequisite и в появившемся диалоговом окне выбрать компоненты, которые должны быть установлены на компьютер пользователя (рисунок 4.15). Чтобы поместить выбранные компоненты непосредственно в дистрибутив необходимо установить переключатель Specify the install location for prerequisites в значение Download prerequisites from the same location as my application.

 Интеграция компонентов в дистрибутив приложения

увеличить изображение
Рис. 4.15. Интеграция компонентов в дистрибутив приложения

Единственная загвоздка заключается в том, что в состав XNA Game Studio 1.0 Express не входит компонент Prerequisite для Visual Studio 2005. Поэтому вам придется установить его из example.zip. Для этого откройте каталог \Tools\XNA Game Studio Express 1.0\VS 2005 Prerequisite и запустите файл install.bat, после чего в списке диалогового окна Prerequisite появится элемент Microsoft XNA Framework. Если файл install.bat вдруг не сможет обнаружить местоположение Visual Studio, скопируйте вручную подкаталог XNAFramework в \Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages\.

Дополнительная информация

Каталог XNAFramework содержит три файла:

  1. xnafxredist .msi - дистрибутив XNA Framework из XNA Game Studio Express 1.0 (каталог \xna Game Studio Express\v1.0\Redist\XNA FX Redist ).
  2. product.xml - описание условий, при которых устанавливается пакет xnafxredist.msi.
  3. \En\package.xml - локализация для английского языка

Ну что ж, осталось только создать инсталлятор (команда контекстного меню Build ), после чего в каталоге \Setup\Release появится проект готового инсталлятора, который можно смело раздавать своим знакомым без риска быть заваленным вопросами наподобие "что такое XNA Framework и где его взять?".

 Установка хранителя экрана на компьютер

Рис. 4.16. Установка хранителя экрана на компьютер
 Предложение установить на компьютер недостающие компоненты

Рис. 4.17. Предложение установить на компьютер недостающие компоненты

Заключение

В этой лекции были подробно рассмотрены все нюансы создания полноценного хранителя экрана, начиная с написания обычного полноэкранного приложения, завершающего работу при активности пользователя, и заканчивая выводом изображения на все мониторы компьютера, реализацией диалогового окна конфигурации хранителя экрана и визуализацией в окне предварительного просмотра. Так же было продемонстрировано применение технологии Windows Installer для создания дистрибутива хранителя экрана, содержащего все необходимые компоненты, включая .NET Framework 2.0 и XNA Framework 1.0.

Андрей Леонов
Андрей Леонов

Reference = add reference, в висуал студия 2010 не могу найти в вкладке Solution Explorer, Microsoft.Xna.Framework. Его нету.