воскресенье, 30 августа 2009 г.

Inno Setup и .NET Framework 2.0

Довелось мне делать проект, который должен был быть очень юзабелен (то есть для простых людей). Платформой проекта была выбрана .NET, а значит, это накладывало некоторые ограничения на его использование на старых операционных системах (типа Windows XP), в которых по умолчанию не установлена эта платформа.

Таким образом, возникла задача - инсталляционный скрипт должен был быть "интеллектуальным", то есть уметь:

  • Определять, требуется ли установка платформы на этом компьютере;
  • И устанавливать эту платформу, естественно. :)

Существует множество различных компиляторов инсталляторов, среди них, к примеру:


Список можно продолжать очень долго, таких компиляторов огромное количество. Я лишь перечислил наиболее популярные среди них.

Мой выбор пал на Inno Setup. Потому как мне кажется этот компилятор наиболее простым в применении и в то же время очень мощным (к примеру, он поддерживает скрипты на языке Pascal и сжатие LZMA). К тому же, тело установщика также очень мало.

Итак, начал я с того, что скачал платформу .NET в виде Redistributable Package. Скачать ее можно, например, отсюда:
http://www.microsoft.com/downloads/details.aspx?FamilyID=0856EACB-4362-4B0D-8EDD-AAB15C5E04F5&displaylang=en

Затем, распаковал с помощью 7-zip скачанный EXE-файл и получил набор установочных файлов, среди которых есть install.exe (устанавливает, собственно, саму платформу).

Параметры командной строки для установки платформы в тихом режиме (или восстановления, если она уже есть на целевой машине): "/q" (без кавычек).

Как я уже сказал, есть один нюанс: если на целевой машине уже установлена .NET 2.0, то установка в тихом режиме представляет собой восстановление. Это занимает много времени при установке, что неприемлемо. Причем восстановление, как правило, совершенно не нужно. Других полезных параметров командной строки для выбора режима установки у install.exe нет. Это ставит перед нами еще один барьер: требуется знать, установлена ли платформа на целевой машине.

На помощь приходит поддержка Pascal-скриптов. Стоит отметить, что эти скрипты не являются компилируемыми и исполняются интерпретатором в реальном времени во время работы инсталлятора. Недолго изучая этот скриптовый паскаль, у меня родилась следующая секция Code:

[Code]
function DotNet20NotInstalled(): Boolean;
var
Installed: Cardinal;
begin
if RegKeyExists(HKEY_LOCAL_MACHINE, 'Software\Microsoft\NET Framework Setup\NDP\v2.0.50727') then
Result := False
else
Result := True;
end;


Теперь у нас есть функция, проверяющая, есть ли на целевой машине платформа .NET версии 2.0. Отлично! Осталось добавить в секцию Files установочные файлы этой платформы:

[Files]
Source: "dotnetfx\*"; DestDir: "{tmp}\dotnetfx"; Flags: ignoreversion recursesubdirs createallsubdirs; Check: DotNet20NotInstalled;


Source параметр содержит путь к установочным файлам .NET. DestDir указывает на временную папку, которая судя по документации выглядит примерно так C:\WINDOWS\TEMP\IS-xxxxx.tmp и создается при работе нашего установщика и деинсталлятора.

Обратите внимение на последний параметр Check. Он позволяет нам избежать распаковки установочных файлов платформы, если это не требуется.

И последнее, запуск установки платформы во время работы установщика. Добавляем соответствующий пункт в секцию Run:

[Run]
Filename: "{tmp}\dotnetfx\install.exe"; Parameters: "/q"; StatusMsg: "Установка Microsoft .NET Framework 2.0... Пожалуйста, дождитесь завершения."; Check: DotNet20NotInstalled;


Думаю, в этой секции все параметры интуитивно понятны и не должны вызвать у вас вопросов.

Итогом компиляции такого скрипта будет наш "умный" установщик с необходимыми требованиями.

Надеюсь, что помог вам сэкономить время на создании установщика, способного самостоятельно следить за средой в которой он запущен и адекватно реагировать на нее.

Комментариев нет:

Отправить комментарий