C# 以编程方式安装MSI包

C# 以编程方式安装MSI包,c#,.net,wix,windows-installer,dtf,C#,.net,Wix,Windows Installer,Dtf,我想从C#.NET应用程序以编程方式安装给定的.msi包,最好使用应用程序指定的安装参数(如安装路径、软件等) 我做了一些搜索,但没有找到任何有用的东西。最有希望的是,但我找不到Microsoft.Deployment.WindowsInstaller或WindowsInstaller.Installer的相关文档。有一个COM对象为安装程序提供API: 首先在项目中添加对COM对象“Microsoft Windows Installer对象库”的引用。然后,您可以从以下代码开始: using

我想从C#.NET应用程序以编程方式安装给定的.msi包,最好使用应用程序指定的安装参数(如安装路径、软件等)


我做了一些搜索,但没有找到任何有用的东西。最有希望的是,但我找不到Microsoft.Deployment.WindowsInstaller或WindowsInstaller.Installer的相关文档。

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

首先在项目中添加对COM对象“Microsoft Windows Installer对象库”的引用。然后,您可以从以下代码开始:

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");
        }
    }
}
还有一个关于“部署工具基础”项目的文档,该项目是WIX3.5安装的一部分,它包含了适用于大多数(如果不是全部)Windows Installer API的.NET包装。下载并安装WiX安装即可获得此功能:(目前为WiX 3.11,2017年8月更新)

在%ProgramFiles%\Windows Installer XML v3.??\SDK\文件夹中找到Microsoft.Deployment.WindowsInstaller.dll文件。在您的C#项目中设置一个引用,并尝试运行不同的API,看看您是否获得了所需的功能


我强烈推荐使用部署工具基金会从.NET代码到任何COM互操作。

< P>最简单的解决方案是使用<代码> MSIEExcel < /C>来调用.MS../P>上的安装程序。
您可以使用命令行设置自定义安装,包括设置.msi属性、静默安装等。

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

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

另一种方法是使用(.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...
此外,您可以直接在命令行中传递参数:

msiexec /i somemsi.msi TRANSFORMS=somemst.mst /qb
msiexec /i <somemsi.msi> /qb AGREETOLICENSE=YES INSTALLDIR=C:\Temp
etc...
msiexec/i/qb AGREETOLICENSE=YES INSTALLDIR=C:\Temp
等
但是,您需要在
ORCA/InstallShield
中编辑
MSI
,以确定实际使用的参数

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


由于存在自定义操作等,实际安装可能会很复杂。事实上,整个行业都是围绕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,因此文档也很有用,这就是我如何在上面的代码片段中计算字符串以适应我的情况。

基本Win32 API(如果需要可以pinvoke)是MSInstallProduct。实际上,所有其他提到的API和调用都将在这里结束

只需将完整路径传递到MSI文件和命令行(包括quiet选项等),然后检查结果以查看是否正确安装

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

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


静态外部UInt32 MSInstallProduct(字符串包路径、字符串命令行)

@David Heffernan:我猜,但它会做我想要它做的吗?嗯,msiexec是最常见的调用方式installer@DavidHeffernan:我查看了文档,它确实允许非gui安装,但是,我看不到任何允许我配置设置的内容(例如设置安装路径)。有什么线索吗?这取决于.msi。您需要传递特定于特定对象的设置。msi@David赫弗南:我怎么能做到?能否请您在回答中详细说明您的想法,以便我可以接受它是否是最佳解决方案?根据文档,InstallProduct将向用户显示GUI向导。我的目标是完全自动化安装。你对此有什么想法吗?你试过“installer.UILevel=msuilevel.msuilevelnone;”吗?我从来没用过。但是值得一试。谢谢,我会尝试一下,但我希望有一些在线文档可以给我一些提示…请查看%ProgramFiles%\Windows Installer XML v3.5\doc\DTF.chm上的帮助文件。还要检查:如何检查MSI安装是否完成?请指导我实现这一点。如何检测msi安装程序的完成?
Process.WaitForExit
是否足够?