c# msi中加入驱动_在 C# 中执行 msi 安装

本文介绍了如何在 C# 应用程序中自定义 MSI 安装过程,包括隐藏默认 UI 并添加取消功能。通过调用 `MsiSetInternalUI` 和 `MsiSetExternalUI` 等 Windows API,实现了一个带有进度条和取消按钮的自定义安装界面。当用户点击取消按钮时,可通过 `MsiProgressHandler` 返回值通知 MSI 安装引擎取消安装。
摘要由CSDN通过智能技术生成

标签:

有时候我们需要在程序中执行另一个程序的安装,这就需要我们去自定义 msi 安装包的执行过程。

需求

比如我要做一个安装管理程序,可以根据用户的选择安装不同的子产品。当用户选择了三个产品时,如果分别显示这三个产品的安装交互 UI 显然是不恰当的。我们期望用一个统一的自定义 UI 去取代每个产品各自的 UI。

实现思路

平时使用 msiexec.exe 习惯了,所以最直接的想法就是在一个子进程中执行:

msiexec.exe /qn

这样固然是能够完成任务,但是不是太简陋了? 安装开始后我们想取消这次安装怎么办? 或者我们还想要拿到一些安装进度的信息。

其实可以通过调用三个 windows API 轻松搞定这个事儿!下面的 C# demo 用一个自定义 Form 来指示多个 MSI 文件的安装过程。Form 上放的是一个滚动条,并且配合一个不断更新的 label。先看看 demo 长什么样子。

下面是安装过程中的 UI:

8qmqKAJ57BcAAAAAElFTkSuQmCC

点击 Cancel 按钮取消安装后的 UI:

H3GBqVStbEAMAAAAAElFTkSuQmCC

主要接口介绍

我们先来了解一下主要用到的几个 win32 API。

首先是 MsiSetInternalUI 方法:

[DllImport("msi.dll", CharSet =CharSet.Auto)]internal static extern int MsiSetInternalUI(int dwUILevel, IntPtr phWnd);

在调用 msiexec.exe 时,我们通过指定 /q 参数让安装过程显示不同的 UI。如果不显示UI的话就要使用参数 /qn 。MsiSetInternalUI 方法就是干这个事儿的。通过下面的调用就可以去掉 msi 中自带的 UI:

NativeMethods.MsiSetInternalUI(2, IntPtr.Zero)

接下来是 MsiSetExternalUI 方法:

[DllImport("msi.dll", CharSet =CharSet.Auto)]internal static extern MsiInstallUIHandler MsiSetExternalUI([MarshalAs(UnmanagedType.FunctionPtr)] MsiIn

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值