Программная установка пакетов MSI

Я хотел бы установить данный пакет .msi программно из моего приложения C # .NET, желательно с параметрами установки, которые указывает мое приложение (например, путь установки, сокращение crapware и т. Д.).

Я сделал некоторые поиски, но я действительно не нашел ничего полезного. Самым многообещающим хитом была эта тема , но я не могу найти документацию о Microsoft.Deployment.WindowsInstaller или WindowsInstaller.Installer на то пошло.

Я считаю, что упомянутый выше проект Foundation Deployment Tools является надежным способом сделать это с .NET. Имея ссылку на Microsoft.Deployment.WindowsInstaller.dll, используйте такой код, чтобы установить пакет:

 Installer.SetInternalUI(InstallUIOptions.Silent); Installer.InstallProduct(msiFilename, "ACTION=INSTALL ALLUSERS=2 MSIINSTALLPERUSER="); 

Документация для .NET-оболочки находится в файле .chm в установочном каталоге установки установщика Windows в Program Files. Некоторые части этой DLL свободно обертывают родные Windows API, поэтому документация здесь также может быть полезна, так как я разработал строку в приведенном выше fragmentе в соответствии с моей ситуацией.

Существует COM-объект, который предлагает API для установщика:

Сначала добавьте ссылку на объект COM «Библиотека объектов установщика Microsoft Windows» в свой проект. Затем вы можете начать со следующего кода:

 using System; using WindowsInstaller; namespace TestApp { public class InstallerTest { public static void Install() { Type type = Type.GetTypeFromProgID("WindowsInstaller.Installer"); Installer installer = (Installer)Activator.CreateInstance(type); installer.InstallProduct("YourPackage.msi"); } } } 

И есть документация об объекте Installer .

Проект « Фонд развертывания », который является частью установки WIX3.5, содержит оболочку .NET для большинства (если не всех) API-интерфейса установщика Windows. Получите его, загрузив и установив установку WiX: http://wixtoolset.org/ (в настоящее время WiX 3.11, обновленный Aug.2017).

Найдите файл Microsoft.Deployment.WindowsInstaller.dll в папке% ProgramFiles% \ Windows Installer XML v3. \ \ SDK \. Задайте ссылку в своем проекте C # и попробуйте запустить различные API-интерфейсы и посмотреть, получаете ли вы желаемую функциональность.

Я настоятельно рекомендую использовать Deployment Tools Foundation через любой COM-Interop из .NET-кода.

Самое простое решение – использовать msiexec для вызова установщика на .msi.

Вы можете настроить установку с помощью параметров командной строки, включая настройку свойств .msi, тихую установку и т. Д.

Существует два подхода к решению вашей проблемы.

Первый, упомянутый @Glytzhkof, – это использовать Microsoft.Deployment.WindowsInstaller .NET wrapper API . Это довольно серьезный материал, но для знакомства с ним требуется некоторое время. Вы можете получить последнюю версию здесь .

Другой подход – использовать Transforms (.MST-файлы). Преобразовать файлы можно с помощью Microsoft Orca или InstallShiled. MST содержат все необходимые настройки и могут применяться к MSI с использованием этой командной строки:

 msiexec /i somemsi.msi TRANSFORMS=somemst.mst /qb 

Кроме того, вы можете передавать параметры непосредственно в командной строке:

 msiexec /i  /qb AGREETOLICENSE=YES INSTALLDIR=C:\Temp etc... 

Тем не менее, вам нужно будет отредактировать MSI в ORCA/InstallShield чтобы определить, какие параметры фактически используются.

Параметры, используемые в приведенном выше примере, не универсальны.

Фактическая установка может быть сложной из-за наличия пользовательских действий и т. Д. На самом деле существует целая индустрия, которая построена вокруг настроек msi. Его называют Applications Repackaging .

Основным API Win32 (который может быть выведен в случае необходимости) является MsiInstallProduct. Здесь практически все другие упомянутые API и вызовы будут в конечном итоге.

https://msdn.microsoft.com/en-us/library/aa370315(v=vs.85).aspx

Просто передайте полный путь к файлу MSI и вашей командной строке (включая тихие параметры и т. Д.) И проверьте результат, чтобы убедиться, что он установлен правильно.

Обратите внимание, что существует простейшее объявление p / invoke для управляемого кода:

[DllImport (“msi.dll”, CharSet = CharSet.Auto, SetLastError = true)]

static extern UInt32 MsiInstallProduct (строка packagePath, строка commandLine);

  • Wix - Как запустить / установить приложение без интерфейса
  • Почему рекомендуется ограничивать использование пользовательских действий в настройках WiX / MSI?
  • Запустить MSI для удаления
  • Какой установочный продукт использовать? InstallShield, WiX, Wise, Advanced Installer и т. Д.
  • Что мне делать при запуске приложения триггеров, повторяющих бесконечный самозапуск установщика Windows?
  • Регистрация DLL CPP в COM после установки с помощью установщика Wix Msi
  • Установщик WiX msi не устанавливает приложение Winform, созданное с помощью Visual Studio 2017
  • DLL не может быть запущена для установщиков MSI
  • Установщик Windows с использованием USB-накопителя для временных целей
  • WiX - установка предварительных требований и сторонних приложений
  • Как регистрировать типы файлов / расширения с помощью установщика WiX?
  • Interesting Posts

    Как получить значения формы из HTTPPOST, словаря или?

    Как создать экземпляр нестатического внутреннего classа с reflectionм в Java?

    Какие файлы, типы файлов и папки исключаются из резервной копии папки пользователя?

    Перезаписывать конкретные разделы в методе записи данных в режиме искривления

    Как увеличить размер шрифта в Android Studio?

    Git объединяет отчеты «Уже обновлено», хотя есть разница

    Как уменьшить размер исполняемого файла, созданного компилятором MinGW g ++?

    Как передать свойство System моему тесту через Gradle и -D

    Использовать внутренние динамики без отсоединения наушников?

    Процесс Linux для фона – relogin – как вернуть процесс на передний план?

    Почему рекомендуется ограничивать использование пользовательских действий в настройках WiX / MSI?

    Как воспроизвести песню из библиотеки itunes в iphone

    FileProvider – IllegalArgumentException: Не удалось найти настроенный root

    Разделить фрейм данных на несколько выходных файлов

    Исключение переполнения для int в C #?

    Давайте будем гением компьютера.