Feb 28, 2009

Использование Web Setup Projects

Всем привет.

На днях потребовалось сделать исталяционный проект для сайта. Я решил использовать Web Setup Project. Когда я начал искать, то оказалось что инфомации по этому поводу как то не очень много, а если есть, то в основном на английском и не полная. Вот я и решил в качестве первой своей статьи описать основные этапы создания инсталяхи.

Итак чего мы хотим:

1. Проверить что на пользовательском компьютере установлен IIS определенной версии 2. После запуска приложения запрашивать у пользователя информацию, необходимую для соеденения с базой данных

Итак начнем. Для пробы я создал пустой веб сайт. Для того чтобы добавить Setup Project правый клик на Solution->Add->New Project->Other Project Types->Setup and deployment->Web Setup Project. 

После добавления открывается закладка File System. Эта вкладка отвечает за то, какие именно файлы будут установлены на машину пользователя. По умолчанию там пусто. Чтобы добавить наш сайт - правый клик на WebApplicationFolder->Add->Project Output. В появившемся окне выбираем наш веб проект и ставим Content Files - это все aspx страницы без codebehind файлов. Для того чтобы инсталлер устанавливал вместе с aspx страницами dll библиотеку с откомпилированными классами также необходимо добавить еще один Project Output, а именно WebApplicationFolder->Add->Project Output, Primary output.

Вот что получилось у меня на данном этапе:

При билде всего солюшена инсталяционные проекты пропускаются (потому как их построение для больших проектов занимает довольно значительное время). Поэтому чтобы получить новую версию исталлера надо правым кликом на проекте инсталлера сбилдить именно его. Тогда в папочке Debug (Release) появится Setup.exe и Setup.msi. 

Итак теперь все готово для того, чтобы начать реализовывать указаный выше план.

1. Для проверки установленной версии IIS

Для просмотра условий установки правый клик на сетап проекте View->Launch conditions.

Там мы видим два раздела, которые показаны в виде папок.

  • Search Target Machine – раздел где можно задавать что следует искать на машине пользователя. Можно искать ключи в реестре, файлы, и установленные компоненты windows. Обычно этот раздел используется парами с соответствующими Launch Conditions. По умолчанию для WebSetupProject стоит поиск IIS.
  • Launch Conditions – тут можно установить необходимые для работы приложения условия.

Касательно моего сценария мне нужно было проверить что на машине установлен 7 iis. Для этого в свойствах IIS Condition устанавливем Condition IISVERSION >= "#7". Таким образом версия IIS должна быть 7 или выше.

Для добавления дополнительных полей для ввода пользователя есть некоторый набор возможных окон. Он ограничен, так что не следует переусердствовать с количеством настроек. Чтобы добавить новый диалог: правый клик на сетап проекте View->UserInterface. Мы видим по шагам этапы которые будет проходить пользователь при установке приложения. Добавляем диалог. У каждого элемента этого диалога есть свойства, а именно: надпись, дефолтное значение, видимость и имя свойства. Предназначение всех свойств вобщем понятно, кроме имени свойства (я добавил диалог TextBoxes(A) и для каждого текст бокса есть EditProperty). Имя свойства это та строка, с помощью которой в дальнейшем можно будет доставать значения веденные пользователем. Пусть это будет “UserName”. Теперь необходимо создать класс, который будет обрабатывать собранные данные и реагировать на них. Для этого добавим к солюшену еще один проект – dll библиотеку. Далее в этот новый проект добавляем Add->NewItem->Installer Class. Созданный класс унаследован от Installer. Переопределяя соответствующие методы у инсталлера мы можем влиять на процесс установки. В данном случае нас интересует метод Install.
 
public override void Install(System.Collections.IDictionary stateSaver)
{
    base.Install(stateSaver);
}
Этот метод будет выполнятся во время инсталляции. Отладку обычным способом для инсталляционных проектов запустить не удастся. Для этого используем Debugger.Break(). Для доступа к данным которые ввел пользователь из этого класса используем свойство Context.Parameters. Это name-value коллекция где ключами выступают значения, которые были вписаны в «Имя свойства». Так чтобы получить доступ к полю UserName, описанному выше, используется следующий вызов: Context.Parameters["UserName"]. Таким образом можно собрать всю необходимую информацю о соеденении с базой данных и прочее.