Программная установка пакетов 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);