14

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

我做了一些搜索,但我还没有真正找到任何有用的东西。最有希望的命中是这个话题,但我找不到任何关于这件事的文档Microsoft.Deployment.WindowsInstaller或文档。WindowsInstaller.Installer

4

6 回答 6

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,因此此处的文档也很有用,这就是我如何计算出上述片段中的字符串以适应我的情况。

于 2012-09-14T01:08:14.637 回答
8

There's a COM object that offers an API for the installer:

First add a reference to COM object "Microsoft Windows Installer Object Library" to your project. Then you can start with the following code:

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

And there's a documentation about the Installer Object.

于 2011-04-23T15:19:33.793 回答
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 互操作上使用部署工具基础。

于 2011-04-24T00:03:47.753 回答
4

基本的 Win32 API(必要时可以调用)是 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(string packagePath, string commandLine);

于 2015-06-24T22:13:16.707 回答
3

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

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

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

但是,您需要编辑其中MSIORCA/InstallShield参数以确定实际使用的参数。

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

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

于 2012-04-18T07:19:55.920 回答
3

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

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

于 2011-04-27T02:32:05.923 回答