Как создать MSI, который просто оборачивает EXE-файл
-
21-08-2019 - |
Вопрос
После слишком многих экспериментов я пришел к выводу, что установщик 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, мягко говоря, необычна - это совершенно новый подход к развертыванию.Тем не менее, при правильном применении 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
Нет, чувак, просто воспользуйся мастером настройки Inno.Это создает установочный EXE-файл, но не MSI.Это займет примерно 5 минут, и у вас будет установщик Windows.
Просто Скачать его, установите его, укажите на свой EXE-файл и следуйте инструкциям на экране