Inno Setup и .NET Framework 2.0
Довелось мне делать проект, который должен был быть очень юзабелен (то есть для простых людей). Платформой проекта была выбрана .NET, а значит, это накладывало некоторые ограничения на его использование на старых операционных системах (типа Windows XP), в которых по умолчанию не установлена эта платформа.
Таким образом, возникла задача – инсталляционный скрипт должен был быть “интеллектуальным”, то есть уметь:
- Определять, требуется ли установка платформы на этом компьютере;
- И устанавливать эту платформу, естественно :)
Существует множество различных компиляторов инсталляторов, среди них, к примеру:
Список можно продолжать очень долго, таких компиляторов огромное количество. Я лишь перечислил наиболее популярные среди них.
Мой выбор пал на Inno Setup. Потому как мне кажется этот компилятор наиболее простым в применении и в то же время очень мощным (к примеру, он поддерживает скрипты на языке Pascal и сжатие LZMA). К тому же, тело установщика также очень мало.
Итак, начал я с того, что скачал платформу .NET в виде Redistributable Package. Скачать ее можно, например, отсюда.
Затем, распаковал с помощью 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;
Думаю, в этой секции все параметры интуитивно понятны и не должны вызвать у вас вопросов.
Итогом компиляции такого скрипта будет наш “умный” установщик с необходимыми требованиями.
Надеюсь, что помог вам сэкономить время на создании установщика, способного самостоятельно следить за средой в которой он запущен и адекватно реагировать на нее.