以编程方式安装MSI包

本文关键字:MSI 安装 方式 编程 | 更新日期: 2023-09-27 17:52:13

我想从我的c# . net应用程序中以编程方式安装一个给定的。msi包,最好使用我的应用程序指定的安装参数(如安装路径,decline crapware等)。

我做了一些搜索,但我没有找到任何有用的东西。最有希望的hit是这个主题,但是我找不到任何关于Microsoft.Deployment.WindowsInstallerWindowsInstaller.Installer的文档。

以编程方式安装MSI包

我发现上面提到的部署工具基础项目是从。net实现这一点的可靠方法。在引用了Microsoft.Deployment.WindowsInstaller.dll之后,使用下面的代码来安装一个包:

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

. net包装器的文档位于程序文件中Windows Installer XML安装目录下的.chm文件中。该DLL的某些部分松散地包装了本机Windows api,因此这里的文档也可以很有用,这就是我如何在上面的代码片段中计算出适合我的情况的字符串。

有一个COM对象为安装程序提供API:

首先在你的项目中添加一个COM对象"Microsoft Windows Installer object Library"的引用。然后可以从下面的代码开始:

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 Object的文档

"Deployment Tools Foundation"项目是WIX3.5安装的一部分,它包含了大多数(如果不是全部的话)Windows Installer API的。net包装器。通过下载并安装WiX install获得:http://wixtoolset.org/(当前为WiX 3.11, 2017年8月更新)。

在%ProgramFiles%'Windows Installer XML v3中找到Microsoft.Deployment.WindowsInstaller.dll文件。??' SDK '文件夹。在你的c#项目中设置一个引用,并尝试运行不同的api,看看你是否得到了想要的功能。

我强烈建议使用Deployment Tools Foundation来处理任何来自。net代码的COM互操作。

基本的Win32 API(必要时可以调用)是MsiInstallProduct。这实际上是所有其他提到的api和调用的最终归宿。

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

只需将完整路径传递给MSI文件和命令行(包括安静选项等),并检查结果,看看它是否正确安装。

请注意,托管代码有一个简单的p/invoke声明:

[DllImport("msi.dll", CharSet = CharSet. dll]汽车、SetLastError = true)

static extern UInt32 MsiInstallProduct(string packagePath, string commandLine);

最简单的解决方案是使用msiexec来调用.msi上的安装程序。

您可以使用命令行设置自定义安装,包括设置。msi属性,静默安装等

有两种方法可以解决你的问题。

@Glytzhkof提到的第一个是使用Microsoft.Deployment.WindowsInstaller .NET wrapper API。这是一些非常强大的东西,但需要一些时间来熟悉。您可以在这里获得最新版本(UPDATE: Stein Åsmul 28.12.2018: DTF现在是WiX工具包的一部分)。

另一种方法是使用Transforms(。MST文件)。转换文件可以使用Microsoft Orca或InstallShiled生成。MSTs包含您需要的所有自定义,并且可以使用以下命令行在MSI上应用:

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

另外,你可以在命令行中直接传递参数:

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

但是,您需要编辑ORCA/InstallShield中的MSI来确定实际使用的参数。

上面示例中使用的参数不是通用的。

由于存在自定义操作等,实际安装可能会很复杂。事实上,有一个完整的行业是围绕msi定制构建的。它叫Applications Repackaging