以编程方式安装MSI包

时间:2011-04-23 14:50:46

标签: c# .net wix windows-installer dtf

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

我做了一些搜索,但我没有找到任何有用的东西。最有希望的打击是this topic,但我找不到Microsoft.Deployment.WindowsInstallerWindowsInstaller.Installer的任何文档。

6 个答案:

答案 0 :(得分:14)

我发现上面提到的Deployment Tools Foundation项目是从.NET执行此操作的可靠方法。引用Microsoft.Deployment.WindowsInstaller.dll后,使用这样的代码来安装包:

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

.NET包装器的文档位于Program Files的Windows Installer XML安装目录中的.chm文件中。该DLL的某些部分松散地包装了本机Windows API,因此文档here也很有用,这就是我在上面的代码片段中计算出符合我情况的字符串的方式。

答案 1 :(得分:7)

有一个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");
        }
    }
}

还有关于Installer Object的文档。

答案 2 :(得分:7)

作为WIX3.5安装一部分的“部署工具基础”项目包含适用于大多数(如果不是全部)Windows Installer API的.NET包装器。通过下载并安装WiX安装来获取它:http://wixtoolset.org/(目前是WiX 3.11,已于2017年8月更新)。

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

我强烈建议在.NET代码的任何COM Interop上使用Deployment Tools Foundation。

答案 3 :(得分:3)

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

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

答案 4 :(得分:3)

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

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

另一种方法是使用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

答案 5 :(得分:3)

基本的Win32 API(必要时可以使用)是MsiInstallProduct。这几乎是所有其他提到的API和调用的结果。

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

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

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

[DllImport(&#34; msi.dll&#34;,CharSet = CharSet.Auto,SetLastError = true)]

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