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

StackOverflow https://stackoverflow.com/questions/854873

Вопрос

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

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

Опции MSI описаны в Msiexec (параметры командной строки) (низкоуровневый "запуск" MSI - это опция msiexec package.msi).

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

Редактировать:это не работает.Недостающий фрагмент:посещаемый / без присмотра, похоже, недоступен.

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

Редактировать:Итак, кто-то опубликовал в качестве дополнительного ответа, оборачивающего все это как пользовательское действие после установки.Теоретически возможно, но поскольку может потребоваться перезагрузка (спасибо MS за .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.

Нет смысла.

Это было полезно?

Решение 4

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

Другие советы

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

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

В любом случае, вот так:

Бесплатно:Викс (здесь)

Это бесплатный инструмент для генерации 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 сгенерированный.Вы устанавливаете это в настройках выпуска.

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

  • Вы можете указать свой вспомогательный EXE-файл, используя прямой редактор и поместив свой EXE-файл в таблицу 'Binary'
  • Вы можете создать пользовательское действие для запуска этого EXE-файла из узла "Пользовательские действия" в дереве слева
  • Вы можете вставить пользовательское действие, выбрав "Установить последовательности" и поместив его в InstallExecuteSequence где - то между InstallInitialize и InstallFinalize как я уже говорил ранее.

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

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

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

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

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

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

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

Добавление к 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 продолжайте его выполнение.

-Мадуреш

Если вы не хотите управлять MSI, а только запускать EXE, попробуйте Бесплатный конвертер Exe в MSI.Вы просто вводите путь к EXE-файлу и получаете MSI.

попробуй это:

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

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

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>

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

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

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

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

Итак - чтобы решить эту:

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

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

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

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

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

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);
        }
    }
}

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

screenshot

Нет, чувак, просто воспользуйся мастером настройки Inno.Это создает установочный EXE-файл, но не MSI.Это займет примерно 5 минут, и у вас будет установщик Windows.

Просто Скачать его, установите его, укажите на свой EXE-файл и следуйте инструкциям на экране

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top