Создание собственного Windows инсталлятора

191
30 января 2018, 07:54

Большинство инсталляторов создаётся при помощи разных утилит (WiX, Inno Setup, Install Shield и т.д.). Меня интересует вопрос создания инсталлятора с собственным UI, как это сделано, например, у Kaspersky Anti-Virus и у Visual Studio.

Возможно ли использование .NET Framework в таких делах или потребуется чистый C++? Не будет ли ни у кого ссылок на пояснения того, что конкретно должен делать инсталлятор?

Answer 1

Для создания кастомного UI через WIX можно использовать Burn / BootstrapperApplication - стандартный способ для создания оберток поверх MSI.

Пример для WPF есть в src-пакете WiX, в папке src\Setup\WixBA. Прикручивается (судя по документации) примерно так:

  1. Собирается DLL с UI (WixBA из примеров)
  2. В bundle.wxs (есть в стандартном шаблоне WiX для VS) добавляется

    <BootstrapperApplicationRef Id="ManagedBootstrapperApplicationHost" >
      <Payload SourceFile="$(var.InstallSourceResources)Bootstrapper\WixBA.dll"/>
      <Payload Id="FusionInstallUX.config"
           SourceFile="$(var.InstallSourceResources)Bootstrapper\WixBA.BootstrapperCore.config"
           Name="BootstrapperCore.config" Compressed="yes"/>
    </BootstrapperApplicationRef>
    

Сам по себе кастомный UI - это просто класс-наследник BootstrapperApplication в сборке, отмеченной атрибутом BootstrapperApplicationAttribute.

Пример конфига:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <sectionGroup
            name="wix.bootstrapper"
            type="Microsoft.Tools.WindowsInstallerXml.Bootstrapper.BootstrapperSectionGroup, BootstrapperCore">
            <section
                name="host"
                type="Microsoft.Tools.WindowsInstallerXml.Bootstrapper.HostSection, BootstrapperCore" />
        </sectionGroup>
    </configSections>
    <startup useLegacyV2RuntimeActivationPolicy="true">
        <supportedRuntime version="v4.0" />
    </startup>
    <wix.bootstrapper>
        <host assemblyName="FusionInstallUX">
            <supportedFramework version="v4\Full" />
            <supportedFramework version="v4\Client" />
        </host>
    </wix.bootstrapper>
</configuration>

Более подробные примеры:

  • Custom WiX Burn bootstrapper user interface?
  • Creating a custom UI installer with WIX Burn Bootstrapper
  • Author Bootstrapper Application for a Bundle

Альтернативный вариант без burn / .NET, который (в теории) можно прикрутить к любому msi-инсталлятору - прописывание EmbeddedUI DLL в таблице MsiEmbeddedUI. Базовый пример и требования к dll расписаны в MSDN, Using an Embedded UI.

Answer 2

Используйте графические интерфейсы, такие как GDI, GDI+, DirectDraw если хотите инсталлятор со своим гуи. Для работы с файлами(распаковка и т.д.) Вам понадобятся такие WinApi функции как CreateFile WriteFile ReadFile. Файлы, которые Вы будете устанавливать могут быть как ресурсами exe'шника, так и отдельным файлом. Запись в реестр тоже через WinApi - RegCreateKeyEx() RegOpenKeyEx() RegCloseKey() RegGetValue() RegSetValueEx() RegDeleteValue().

READ ALSO
Как присвоить родителю объект в Unity?

Как присвоить родителю объект в Unity?

нужно присвоить Main Camera обратно родителю Player

205
Анимация кнопки в XAML

Анимация кнопки в XAML

Сделал примитивную кнопку с анимацией на MouseEnter и MouseLeaveЕсли быстро провести мышкой через кнопку насквозь, то анимация MouseEnter запустится, потом...

203
Визуализация графа с помощью Graphviz

Визуализация графа с помощью Graphviz

Как отобразить на форме граф с помощью данной библиотеки?

216