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

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

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

Ответ 1

Я считаю, что упомянутый выше проект 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 свободно обертывают родные API Windows, поэтому документация здесь может быть полезна, так как я разработал строку в приведенном выше фрагменте, чтобы соответствовать моим ситуация.

Ответ 2

Там 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");
        }
    }
}

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

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

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

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

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

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

msiexec /i <somemsi.msi> /qb AGREETOLICENSE=YES INSTALLDIR=C:\Temp
etc...

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

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

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

Ответ 6

Основным 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);