Подтвердить что ты не робот

Как сделать MSI, который просто обертывает EXE файл

После слишком много экспериментов я пришел к выводу, что установщик Windows - это просто плохая технология. Но клиенты хотят файлы MSI.

Итак, как я могу создать файл MSI, который извлекает EXE файл во временный каталог и запускает его с параметрами, аналогичными или похожими, которые были переданы в EXE файл?

Параметры для MSI объясняются в Msiexec (параметры командной строки) (низкоуровневый "запуск" MSI - это пакет параметров msiexec. MSI).

EDIT: решение mjmarsh WiX выглядит так, как будто оно работает. У меня просто не было возможности попробовать еще (время хруста). Если это сработает, я буду принимать его.

EDIT: он не работает. Отсутствующая часть: участие/без присмотра не представляется доступным.

Во всяком случае, единственное, что сделало бы эту работу вообще, - это заставить пользовательское действие убить его родительский процесс!

EDIT: Так кто-то опубликовал как дополнительный ответ, обертывающий все это как пользовательское действие после установки. Теоретически возможно, но поскольку может потребоваться перезагрузка (спасибо MS for.NET 4, требующий перезагрузки иногда), мы должны продолжить хакерство. Итак, из матрицы преимуществ:

Transparency: No. One big custom action.
Customizability: No.
Standardization: No. 
Management and reporting: No. Appears to work but will not.
Security: No benefit.
Validation: No. The hackery required to survive reboot makes this sure to not work.
Resiliency: Completely defeated.
Rollback: No. Rollback didn't work when we were using MSI anyway.
Patching & Updates: No. We have a local solution anyway.
Logging: No. Appears to work but will not.

Нет точки.

4b9b3361

Ответ 1

Нет решения. Мы пошли NSIS, так как корпоративная установка MSI все равно будет ломаться из-за проблемы с вложением MSI (просто попробуйте установить EXE-упаковку MSI изнутри MSI когда-нибудь).

Ответ 2

Ну, есть бесплатный способ и способ $$$. Я не могу документировать все здесь, но это должно заставить вас начать.

С другой стороны, да, Windows Installer - это безумная технология. Есть много раз, когда я думаю, что задача будет простой, но на самом деле она становится сложной. Вам обязательно нужно погрузиться, чтобы понять это.

В любом случае, здесь идет:

Бесплатно: WiX ( здесь)

Это бесплатный инструмент для создания файлов MSI из набора файлов конфигурации XML. Я оставлю вас найти учебники онлайн, но вот суть:

Вы можете сжать EXE в установщик, используя следующий тег в файле WXS:

<Binary Id="MYEXE" src="<path to my exe?"/>

Затем вы можете создать настраиваемое действие, которое запускает ваш EXE файл:

<CustomAction Id="EXECA_CALLMYEXE" Return="check" Execute="deferred" BinaryKey="MYEXE"
      ExeCommand="my command line"/>

Затем вы вставляете свое настраиваемое действие в InstallExecuteSequence в соответствующем месте (я почти всегда запускаю мой где-то между InstallInitialize и InstallFinalize)

<InstallExecuteSequence>
   <Custom Action="EXECA_CALLMYEXE" After="InstallInitialize"><![CDATA[Not REMOVE]]></Custom>

$$$: Получить InstallShield ( ЗДЕСЬ)

Сначала создайте проект "Basic MSI" и убедитесь, что вы говорите, что не хотите, чтобы setup.exe не сгенерировался. Вы устанавливаете это в настройках Release.

Затем вы по существу делаете то же самое, что и с WiX, но у вас есть пользовательский интерфейс.

  • Вы можете указать ваш вспомогательный EXE файл с помощью Direct Editor и поместить ваш EXE файл в таблицу "Binary"
  • Вы можете создать собственное действие для запуска этого EXE файла из "Пользовательских действий" Node в дереве слева
  • Вы можете вставить пользовательское действие, выбрав "Install Sequences" и поместив его в InstallExecuteSequence где-то между InstallInitialize и InstallFinalize, как я сказал ранее.

Извините, я не мог быть более подробным, но это должно быть хорошим началом.

Ответ 3

Я думаю, что самый простой способ создать файл .MSI - использовать WiX.

Урок 1 из учебника WiX - это все, что вам нужно для создания простой установки.

Ответ 4

Джошуа, я очень хорошо понимаю ваше разочарование. MSI причудлива, если не сказать больше, - совершенно новый способ подумать о развертывании. Тем не менее, применяется правильно MSI предлагает наилучшее развертывание, особенно для корпоративных клиентов.

Какие операции выполняет ваш установщик EXE? Является ли это в основном копией файлов, некоторой регистрацией COM и некоторыми реестрами, или же она запускает сложную логику установки, настраивает базы данных и т.д.?? Причина, о которой я прошу, заключается в том, что, возможно, очень быстро создать хорошо функционирующий WIX MSI для вас, чтобы вы могли отказаться от подхода EXE.

Действительно, можно запускать EXE изнутри MSI, но для этого требуется правильное упорядочение, и это гарантирует, что вы получите больше блюза, чем просто MSI. Если приложение мало и не делает ничего сумасшедшего во время установки, я был бы рад предоставить вам базовое преобразование WIX.

Ответ 5

Существует также бесплатная версия MSI Wrapper. Он также поддерживает удаление и обновление. Кроме того, он создает только одну запись в программах добавления или удаления.

Ответ 6

Добавив в weir's ответ, измените custom action attribute, как показано ниже:

<!--Run Action-->
    <CustomAction Id="RunWrappedExe"
                  Return="asyncNoWait"
                  FileKey="ApplicationFileId"
                  Execute="deferred"
                  ExeCommand=""
                  HideTarget="no"
                  Impersonate="yes"/>

Настройка Return=asyncNoWai не ждет возврата exe. Установщик выполняет эту работу и закрывается нормально. Между тем, exe продолжает выполнение.

-Madhuresh

Ответ 7

Wix может это сделать. Вот мой пример кода для wix 3.5:

<?xml version='1.0'?>
<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'>
   <Product Id='*' UpgradeCode="11111111-2222-3333-4444-555555555555" 
        Name='My Setup' Language='1033' Version='1.0.0.0' 
        Manufacturer='Your company'>

    <Package Description='pak' InstallerVersion='200' Compressed='yes' />

    <Media Id='1' Cabinet='setup.cab' EmbedCab='yes' />

    <Directory Id='TARGETDIR' Name='SourceDir'>
        <Directory Id="TempFolder">
            <Directory Id="INSTALLLOCATION" Name="~_tmpdir">
                <Component Id='MyComponent' DiskId='1' Guid=''>
                    <File Id="File0" Name="setup.exe" Source="setup.exe" />
                    <File Id="File1" Name="file1.txt" Source="file1.txt" />
                </Component>
            </Directory>
        </Directory>
    </Directory>

    <Feature Id='InstallFeature' Title='Install Feature' Level='1'>
        <ComponentRef Id='MyComponent' />
    </Feature>

    <!-- Run Action -->
    <CustomAction Id="RunWrapExe" Return="ignore" Execute="deferred" 
                  FileKey="File0" ExeCommand="setup.exe param here"  
                  HideTarget="no" Impersonate="no" />

    <InstallExecuteSequence>
        <Custom Action="RunWrapExe" 
                After="InstallFiles">NOT REMOVE~="ALL"</Custom>
    </InstallExecuteSequence>

   </Product>
</Wix>

Ответ 8

Если вы не хотите управлять MSI, но только выполняете EXE, попробуйте Exe to MSI Converter Free. Вы просто положили путь к EXE и получили MSI.

Ответ 9

попробуйте следующее:

В пакете MSI появляется запрос поведения "Запустить приложение после установки", это означает, что ваш exe файл будет выполнен после установки MSI (MSI будет закрыт).

Попробуйте выполнить exe там, поэтому, когда ваш exe вызовет другие пакеты MSI, он не будет конфликтовать с первым.

Ответ 10

У меня была такая же проблема (оберните EXE, вызовите другую MSI из EXE, включая setup.net и т.д.), и вот мое решение:

Я создаю установку exe с помощью InstallAware. У этого есть свой собственный MSI Wrapper, который обертывает сгенерированный EXE с MSI.

Он работает нормально, EXE может без проблем вызывать другие MSI (включая настройку .net, другие сторонние настройки), но это потому, что запускающая MSI заканчивает ( "возвращает" ) права после запуска EXE файла установки, и таким образом они избегают ограничения MSI рекурсивных вызовов MSI.

НО. Некоторые клиенты (компании), которые используют инструменты развертывания MSI, требуют, чтобы MSI (msiexec) возвращался (заканчивался) только после завершения процесса установки, и это проблема с вышеупомянутым решением.

Итак - решить это:

Существует еще один MSI Wrapper (exemsi.com), который генерирует MSI, который возвращается только после завершения EXE-установки, но для этого вы должны использовать другой уникальный вариант InstallAware:

У InstallAware есть возможность генерировать EXE-установку, используя собственный собственный движок, а не на основе механизма установщика Windows, чтобы избежать рекурсивного ограничения MSI. Объедините их оба, и у вас есть идеальное решение.

Надеюсь, это поможет кому-то, хотя прошло много лет, так как этот вопрос был впервые опубликован.

Ответ 11

Простой трюк:

Изображение проекта

using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;

namespace Setup
{
    internal class Program
    {
        [DllImport("kernel32.dll")]
        private static extern IntPtr GetConsoleWindow();

        [DllImport("user32.dll")]
        private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

        private static void Main(string[] args)
        {
            ShowWindow(GetConsoleWindow(), 0);
            Stream st = Assembly.GetExecutingAssembly().GetManifestResourceStream("Setup.MSI.Temp.msi");
            string path = Path.Combine(System.IO.Path.GetTempPath(), "Temp.msi");
            using (var fileStream = new FileStream(path, FileMode.Create, FileAccess.Write))
            {
                st.CopyTo(fileStream);
            }
            Process p = new Process();
            p.StartInfo.FileName = path;
            p.Start();
            p.WaitForExit();
            File.Delete(path);
        }
    }
}

Ответ 12

Я сделал простой и бесплатный инструмент .NET для создания MSI из exe или папки (с использованием wixsharp и wix) http://legacy.averbouch.biz/free-msi-wrapper

screenshot

Ответ 13

Нах, просто используйте мастер установки Inno. Он создает установку EXE, но не MSI. Это похоже на 5 минут, и у вас будет установщик окон.

Просто загрузите его, установите его, наведите на свой EXE и следуйте экранным подсказкам