Как сделать MSI, который просто обертывает EXE-файл
после слишком многих экспериментов, я пришел к выводу, что установщик Windows-это просто плохая технология. Но клиенты хотят файлы MSI.
Итак, как я могу создать файл MSI, который извлекает EXE-файл во временный каталог и запускает его с теми же или подобными параметрами, которые были переданы в EXE-файл?
параметры MSI объясняются в Msiexec (параметры командной строки) (низкоуровневый "запуск" MSI-это опция msiexec пакет.компания MSI.)
EDIT: решение WiX mjmarsh выглядит так, как будто оно работает. У меня просто еще не было возможности попробовать (время хруста). Если это сработает, я приму это.
EDIT: он не работает. Недостающая часть: участие / без присмотра, похоже, недоступно.
в любом случае, единственное, чтобы сделать эту работу вообще, было бы для пользовательского действия, чтобы убить его родительский процесс!
EDIT: Итак, кто-то опубликовал в качестве дальнейшего ответа, обернув все это как пользовательское действие после установки. Теоретически возможно, но так как перезагрузка может потребоваться (спасибо 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.
нет смысла.
12 ответов
Ну, есть свободный путь и путь$$$. Я не могу все здесь, но это должно вам начать работу.
на боковой ноте, да, установщик Windows-это сводящая с ума технология. Есть много раз, когда я думаю, что задача будет простой, но на самом деле усложняется. Вы определенно должны погрузиться, чтобы понять это.
в любом случае, здесь идет:
Бесплатно: 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" и убедитесь, что вы говорите, что хотите настройки.сгенерированный EXE-файл. Установите это в настройках выпуска.
тогда вы по существу делаете то же самое, что и с WiX, но у вас есть пользовательский интерфейс для него.
- вы можете укажите свой вспомогательный EXE-файл с помощью прямого редактора и поместите EXE-файл в двоичную таблицу
- вы можете создать пользовательское действие для запуска этого EXE-файла из узла "пользовательские действия" в дереве слева
- вы можете вставить пользовательское действие, выбрав "установить последовательности" и поместив его в
InstallExecuteSequence
где-то междуInstallInitialize
иInstallFinalize
как я уже говорил раньше.
Извините, я не мог быть более подробным, но это должно быть хорошо начать.
Джошуа, я очень хорошо понимаю ваше разочарование. MSI - это, мягко говоря, причудливый-совершенно новый способ думать о развертывании. Тем не менее, правильно примененный MSI предлагает наилучшее возможное развертывание, особенно для корпоративных клиентов.
какие операции выполняет установщик EXE? Это в основном копия файла, некоторая Регистрация COM и некоторые записи реестра, или он запускает сложную логику установки, настройку баз данных и т. д...? Почему я спрашиваю это потому, что он, вероятно, будет очень быстро создать хорошо функционирующий Wix MSI для вас, чтобы вы могли отказаться от подхода EXE.
действительно можно запустить EXE изнутри MSI, но это требует правильной последовательности, и это гарантированно вызовет у вас больше блюза, чем простой MSI. Если приложение небольшое и не делает ничего сумасшедшего во время установки, я был бы рад предоставить вам базовое преобразование WIX.
нет решения. Мы пошли NSIS, поскольку корпоративная установка MSI будет нарушена в любом случае из-за проблемы с вложенностью MSI (просто попробовать установка EXE-упаковки MSI изнутри MSI когда-нибудь).
также бесплатная версия MSI Wrapper. Он также поддерживает удаление и обновление. Кроме того, он создает только одну запись в Установка и удаление программ.
добавлять к 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
попробуйте это:
в пакете 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>
Если вы не хотите управлять MSI, а только выполнять EXE, попробуйте Exe в MSI конвертер бесплатно. Вы просто поместите путь к EXE и получите MSI.
У меня была та же проблема (wrap EXE, вызов другого MSI из EXE, включая установку .net и т. д.), и вот мое решение:
Я создаю установочный exe с помощью InstallAware. Он имеет свою собственную MSI-оболочку, которая обертывает сгенерированный EXE с MSI.
Он работает нормально, EXE может вызывать другие MSIs без каких-либо проблем (включая .net setup, другие сторонние настройки), но это потому, что запуск MSI заканчивается ("возвращает") права после запуска EXE-файла установки, и таким образом они избегают ограничения MSI рекурсивных вызовов MSI.
но-некоторые клиенты (компании), которые используют инструменты развертывания MSI, требуют, чтобы MSI (msiexec) возвращал (конец) только после завершения процесса установки, и это проблема с вышеуказанным решением.
Итак-чтобы решить эту проблему:
есть еще одна оболочка MSI (exemsi.com), который генерирует MSI, который возвращается только после завершения установки EXE, но для его использования необходимо использовать другой уникальный параметр InstallAware:
InstallAware имеет возможность генерировать установку EXE, используя свой собственный движок, а не на основе Windows Installer engine, чтобы избежать рекурсивного ограничения 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);
}
}
}
не человек, просто используйте мастер Inno Setup. Это делает установку EXE, но не MSI. Это как 5 минут, и у вас будет установщик windows.
просто скачать это, установите его, укажите его на свой EXE и следуйте инструкциям на экране