Как сделать инсталлятор visual studio
Inno Setup: создание инсталлятора на примере развертывания C# приложения
Введение
Я не являюсь профессиональным программистом. В том смысле, что не зарабатываю денег этим ремеслом, а использую свои навыки в качестве инструмента для основной, научной, деятельности. Поэтому все мои «поделки» живут лишь отведенный им на решение конкретной задачи период и не выходят за пределы каталогов проекта. Кроме того, уже довольно давно я отошел от разработки под ОС Windows, ибо Linux для решения моих задач более удобен.
Однако ученым тоже хочется кушать, прилично одеваться и заправлять машину. Поэтому (правда довольно редко) возникает необходимость немного пофрилансить.
Недавно мне подкинули не слишком сложный проект — одна фирма хочет написать аналог программы, имеющейся у другой. Немного реверсинга, немного кодинга, в целом проект вполне обыденный. Однако тут же возник вопрос о создании инсталлятора — клиент ведь желает продукт «под ключ», чтобы клацнуть на «сетап», понажимать «Далее» и получить готовую к работе программу.
Созданием инсталляторов я не занимался никогда. Поэтому данный вопрос был основательно «загуглен», в числе прочего попалась и такая статья с Хабра. Выбор средств для подобной задачи довольно широк, и включает как проприетарные, так и открытые продукты. Вот список того, что я «пощупал»
Так что в статье мы будем рассматривать пример использования Inno Setup, для которого имеется полезный фронтэнд Inno Script Studio, позволяющий выполнять создание простых инсталляторов с помощью мастера и менять настройки через GUI. GUI понадобился мне для первого знакомства, с продуктом, но мы не будем уделять ему большого внимания — мой «линукс головного мозга» в последнее время всё больше и больше уводит меня от желания использовать разного рода «мастера» (это субъективно, прошу не пинать). Мы рассмотрим хардкорный способ написания скрипта с чистого листа.
1. Установка, настройка и простой (но довольно солидный) скрипт
Думаю, что скачать программу с официального сайта и установить её труда не составит. Запускаем Inno Setup Compiler и видим такое окно
Пугающе уныло встречает нас Inno Setup.
Что это? По сути это просто-напросто редактор для набора скриптов, снабженный подсветкой синтаксиса и кнопками компиляции и запуска. От нас ждут, что мы начнем набирать в этом окне текст скрипта, определяющий логику работы будущего инсталлятора. Ну так и не будем терять время.
Прежде всего определим необходимые константы
Эти строки будут часто встречаться в коде скрипта, поэтому определяем их, как и в C, с помощью дерективы #define
Тело скрипта разделяется на секции, каждая из которых несет свое функциональное назначение. Обязательная секция [Setup] задает глобальные параметры работы инсталлятора и деинсталатора.
Путь, по умолчанию предлагаемый инсталлятором для установки определяем опцией DefaultDirName. При этом переменная — это путь в каталог Program Files соответствующей разрядности. Опция DefaultGroupName определяет имя группы программы в меню «Пуск». Обратите внимание на то, что для указания имени приложения мы используем данное нами выше макроопределение Name, обрамляя его фигурными скобками и решеткой.
Пара опций OutputDir и OutputBaseFileName задают каталог, куда будет записан скомпилированный «сетап» и его имя (без расширения). Кроме этого, указываем где взять иконку для test-setup.exe опцией SetupIconFile.
Последние опции в этой секции определяют алгоритм сжатия (LZMA) и указывают, что все файлы сжимаются одновременно, а не по отдельности (SolidCompression) что ускоряет процесс распаковки при большом количестве однотипных файлов.
В хорошем исталяторе должна быть поддержка нескольких языков. Включаем её в наш «сетап», используя опциональную секцию [Languages]. При отсутствии данной секции будет использоваться английский язык.
Каждая строка в данной секции задает один из используемых при установке языков. Синтаксис строки таков
в качестве разделителя параметров используется точка с запятой. Параметр Name говорит сам за себя — «имя» языка, допускаются общепринятые двухбуквенные сокращения («en», «ru», «de» и так далее). Параметр MessagesFile сообщает компилятору в каком месте взять шаблон сообщений, выводимых при инсталляции. Эти шаблоны берем в каталоге компилятора Inno Setup, о чем мы сообщаем директивой compiler. Для английского языка годится шаблон Default.isl, для русского — Languages\Russian.isl
Параметр LicenseFile задает путь к файлу с текстом лицензии на соответствующем языке.
Обычно установщик предлагает нам, например, определится, хотим мы или не хотим создать ярлык на рабочем столе. Такие опции установки определяются необязательной секцией [Tasks]
Здесь Name задает имя операции — «desktopicom» — создание иконки на рабочем столе; Description — описание чекбокса с опцией, которое увидит пользователь. Конструкция
задает стандартный текст сообщения, соответствующий выбранному в начале инсталляции языку. Параметр GroupDescription — заголовок группы чекбоксов с опциями. Параметр Flags задает определенные действия и состояния элементов управления, в данном случае указывая, что галочка «создать ярлык на рабочем столе» должна быть снята.
Теперь укажем, какие файлы надо включить в дистрибутив и где их надо поместить при установке. Для этого используется обязательная секция [Files]
Наконец, чтобы всё было красиво, опционально укажем компилятору, где брать иконки для размещения в меню программ и на рабочем столе
Тут я указываю, что для группы в меню «Пуск» и для рабочего стола иконку надо брать из исполняемого модуля. Естественно, что иконка должна быть в него «вкомпилена», иначе в требуемых местах мы увидим стандартный значок из коллекции винды.
Итак, всё вроде готово. Жмем Ctrl + F9 и пытаемся собрать инсталлятор. Если не допущены синтаксические ошибки, начнется процесс сборки
Inno Setup собирает инсталлятор
После успешной сборки инсталлятор можно запустить, нажав F9. Если Вы работаете под учеткой с ограниченными правами (а я работаю в винде именно так), то придется полезть в каталог с результатами компиляции, который мы указали в скрипте, и запустить инсталлятор с правами админа
Запуск инсталлятора под ограниченной учетной записью
В итоге мы увидим до боли знакомое каждому пользователю Windows окно выбора языка
приветствие мастера
лицензионное соглашение
ну и так далее. Приятно, что по умолчанию используется лаконичный дизайн мастера, без рюшечек (которые при желании можно добавить)
Ну что сказать? Ура! Мы написали свой первый «сетап» и могли бы радоваться, но
Вы не заметили, что мы о чем-то забыли? Приложение, созданное на C# не будет работать без фреймворка, с которым оно было собрано, если таковой отсутствует в системе. Соответствующий фреймворк надо установить, а для этого необходимо
Значения в реестре, которые необходимо проверить приведены в официальной документации Microsoft, в статье я приведу краткую выжимку из неё
Для реализации произвольной логики работы инсталлятора в Inno Setup предусмотрена секция [Code]. В пределах этой секции размещается код реализующих логику функций на языке Pascal. Содежимое этой секции мы вынесем в отдельный файл dotnet.pas и включим в основной скрипт дерективой #include
хотя можно набить код и непосредственно в секции [Code]. Надо помнить, что внутри этой секции используется синтаксис Pascal, и комментарии предваряются последовательностью «//» вместо используемой в основной части скрипта точки с запятой.
Не смотря на обилие кода, логика его работы достаточно проста — в зависимости от значения параметра version с помощью функции RegQueryDWordValue(. ) читается значение соответствующего ключа реестра и сравнивается с требуемым значением (смотрим таблицу 1). Для версии 4.5 дополнительно передаем номер релиза в параметре release.
Для того, чтобы перед началом установки проверить наличие фреймворка и сообщить пользователю о предпринимаемых действиях используем Callback-функцию InitializeSetup()
Сам запуск инсталляции фрейворка можно выполнить после установки основной программы, поэтому включаем в скрипт секцию [Run], в которой указывается, что необходимо запускать по окончании установки
Обратите внимание на то, что мы сначала указываем имя секции [Run], чтобы закрыть секцию [Code], а затем пишем комментарий начинающийся с точки с запятой. Это необходимо из-за различия синтаксиса основного скрипта и секции [Code], в противном случае при компиляции мы получим синтаксическую ошибку.
В секции задается путь к инсталлятору фреймворка — предварительно он распакован нами во временный каталог (переменная содержит путь к веременному каталогу); задаются параметры командной строки. Опция Check определяет условие запуска инсталляции — это отсутствие в целевой системе нужного нам фреймворка. Опция StatusMsg определяет сообщение, которое увидит пользователь в окне инсталлера.
Снова компилируем наш проект. Теперь, при запуске на «чистой» винде инсталлятор выдаст сообщение
Майкрософт просит нас принять лицензию.
После этого мы получаем работоспособное C# приложение установленное «по взрослому»
Заключение
Я не профессионал и во многих вещах могу ошибаться. Прошу отнестись к этому с пониманием. Статья писалась нубом для нубов, её основная цель — задать вектор поиска при решении задачи написания инсталлятора. За остальными вопросами можно обратится к документации, поставляемой вместе с Inno Setup.
Код данного примера доступен в моем репозитории на Github. «Кракозябры» в комментах вызваны несовпадением кирилических кодировок. Для себя всегда пишу английские комментарии, но для лучшего понимания кода допустил этот ляп. При скачивании в винде всё просматривается замечательно, так что прошу простить мне и эту несуразность.
В остальном, полагаю «хаутушка» вышла достойной и благодарю за уделенное мне внимание.
Создание файла Установщика приложений в Visual Studio Create an App Installer file with Visual Studio
Местоположение файла установщика приложений App Installer file location
Настройка проекта для подходящей версии Windows Configure the project to target the correct Windows version
Можно настроить свойство TargetPlatformMinVersion при создании проекта или изменить его позже в свойствах проекта. You can either configure the TargetPlatformMinVersion property when you create the project, or change it later from the project properties.
Файл установщика приложения создается только при использовании TargetPlatformMinVersion Windows 10 версии 1803 или более поздней. The app installer file is only generated when the TargetPlatformMinVersion is Windows 10, Version 1803 or greater.
Создание пакетов Create packages
Чтобы распространить приложение с помощью загрузки неопубликованных приложений, необходимо создать пакет приложения (Appx/. msix) или набор приложений (. appxbundle/. msixbundle) и опубликовать его в общем расположении. To distribute an app via sideloading, you must create an app package (.appx/.msix) or app bundle (.appxbundle/.msixbundle) and publish it in a shared location.
Для этого используйте мастер создания пакетов приложения в Visual Studio и выполните следующие шаги. To do that, use the Create App Packages wizard in Visual Studio with the following steps.
Откроется мастер Создание пакетов приложения. The Create App Packages wizard appears.
Выберите Я хочу создать пакеты для загрузки неопубликованных приложений. Select I want to create packages for sideloading. и Включить автоматические обновления and Enable automatic updates
Включить автоматические обновления включается, только если для TargetPlatformMinVersion проекта указана подходящая версия Windows 10. Enable automatic updates is enabled only if the project’s TargetPlatformMinVersion is set to the correct version of Windows 10.
Не забудьте выбрать поддерживаемые конфигурации архитектуры в диалоговом окне Выберите и настройте пакеты. The Select and Configure Packages dialog allows you to select the supported architecture configurations. Если выбран пакет, он создаст отдельный установщик, однако если вы не хотите использовать пакет и предпочитаете по одному пакету на архитектуру, вы получите один файл установщика на архитектуру. If you select a bundle it will generate a single installer, however if you don’t want a bundle and prefer one package per architecture you will also get one installer file per architecture. Если вы не уверены, какие архитектуры выбрать, или хотите узнать больше о том, какие архитектуры используются разными устройствами, см. информацию в разделе Архитектуры пакета приложения. If you’re unsure which architecture(s) to choose, or want to learn more about which architectures are used by various devices, see App package architectures.
Настройте любые дополнительные сведения, включая номер версии и выходное расположение пакета. Configure any additional details, such as version numbering or the package output location.
Если установлен флажок Включить автоматические обновления в шаге 2, отобразится диалоговое окно Настройка параметров обновления. If you checked Enable automatic updates in Step 2, the Configure Update Settings dialog will appear. Здесь можно указать URL-адрес установки и периодичность проверки обновлений. Here, you can specify the Installation URL and the frequency of update checks.
Если приложение успешно упаковано, в диалоговом окне отобразится расположение выходной папки, которая содержит ваш пакет приложения. When your app has been successfully packaged, a dialog will display the location of the output folder containing your app package. Выходная папка содержит все файлы, необходимые для загрузки неопубликованного приложения, включая страницу HTML, которую можно использовать для продвижения вашего приложения. The output folder includes all the files needed to sideload the app, including an HTML page that can be used to promote your app.
Публикация пакетов Publish packages
Чтобы сделать приложение доступным, необходимо опубликовать созданные файлы в указанном местоположении: To make the application available the generated files must be published to the location specified:
Публикация в общие папки (UNC) Publish to shared folders (UNC)
Если требуется опубликовать пакеты с помощью общих папок UNC, укажите один и тот же путь для выходной папки пакета приложения и URL-адреса установки (см. подробные сведения в шаге 6). If you want to publish your packages over Universal Naming Convention (UNC) shared folders, configure the app package output folder and the Installation URL (see Step 6 for details) to the same path. Мастер создаст файлы в правильном местоположении, а пользователи будут получать приложение и будущие обновления к нему по тому же пути. The wizard will generate the files in the correct location, and users will get both the app and future updates from the same path.
Публикация в местоположении в Интернете (HTTP) Publish to a web location (HTTP)
Чтобы выполнить публикацию в местоположении в Интернете, требуется доступ, позволяющий публиковать содержимое на веб-сервере. Убедитесь, что окончательный URL-адрес соответствует URL-адресу установки, определенному в мастере (см. подробные сведения в шаге 6). Publishing to a web location requires access to publish content to the web server, making sure the final URL matches the Installation URL defined in the wizard (see Step 6 for details). Как правило, для отправки файлов используется протокол FTP или SFTP, однако существуют и другие методы публикации, например MSDeploy, SSH или хранилище BLOB-объектов (в зависимости от вашего интернет-провайдера). Typically, File Transfer Protocol (FTP) or SSH File Transfer Protocol (SFTP) are used to upload the files, but there are other publishing methods like MSDeploy, SSH, or Blob storage, depending on your web provider.
Инсталлер средствами Visual Studio
Перед многими программистами становится задача, как распространить свое приложение. Конечно, можно его поставлять и в исходных кодах, если вы пишете Open Source Software, но в таком случае обычному пользователю будет не слишком удобно даже с помощью мануала запускать компилятор, например, csc.exe (компилятор C#) с различными параметрами. Для обычных пользователей намного лучше скачать инсталляционный файл и в несколько щелчков мыши установить приложение на свой компьютер.
В этой статье я расскажу, как создать свой установочный файл. Конечно, есть различные платные и бесплатные программы, позволяющие создавать инсталляторы, но если вы пишете свой код в Visual Studio, то там есть уже все необходимое для создания простенького установщика.
Для примера я создал библиотеку, имеющую название SuperLib.dll и содержащую следующий код:
Код этой ценной библиотеки вы можете использовать в своих приложениях без спроса, я разрешаю.
Второй файл – это исполняемый файл, который использует данную библиотеку. Исполняемый файл я назвал vro-test.exe (форма изображена на рисунке).
Вот код vro-test.exe:
Теперь у нас есть цель – создать инсталлятор, который установит vro-test.exe и SuperLib.dll на компьютер пользователя.
Для приложений Windows стоит выбирать либо Setup Project, либо Setup Wizard (первый сразу создает проект, свойства которого вы можете менять, а второй сначала с помощью мастера установит основные параметры, а в конце создаст проект). В статье я рассмотрю случай с использованием Setup Wizard.
Первым вопросом мастера будет тип приложения – Windows application, web application, merge module или CAB file. Для vro-test естественно подойдет Windows application.
Следующим шагом мастер предложит включить в проект вывод других проектов решения, например, файлы с документацией, отладочные символы, файлы с исходниками и т.д. На четвертом шаге вы сможете добавить к проекту любые файлы. Тут добавим vro-test.exe и SuperLib.dll:
В принципе, тут можно нажать Finish, т.к. на пятом шаге мастер покажет суммарную информацию по проекту.
Теперь у нас есть проект установочного файла. Можно добавлять другие файлы и менять различные настройки. Основные параметры приведены в таблице:
Задав все необходимые значения, можем смело делать build. В выводе билда (Debug или Release) теперь находятся два файла – Setup.exe и vro-test-setup.msi. Распространять можно любой из них. Теперь с помощью мастера можно выбрать директорию, в которую устанавливать приложение и менять параметр InstallAllUsers.
После установки при повторном запуске приложения будет предложено либо исправить установку, либо удалить установленное приложение:
Также установленное приложение появится в списке оснастки Программы и компоненты (Установка и удаление приложений в Windows XP):
На этом все. Удачи в разработке!
Written by Поротников Андрей aka wwwnet
Email: