WiX 自定义引导程序 - 单实例检查

Posted

技术标签:

【中文标题】WiX 自定义引导程序 - 单实例检查【英文标题】:WiX Custom Bootstrapper - Single Instance Check 【发布时间】:2013-10-21 15:17:35 【问题描述】:

我使用以下代码检查 CustomBA 的单个实例是否已经在 CustomBA 的 Run 块中运行。

当用户通过双击启动“setup.exe”(CustomBA)时,下面的代码会返回 true,这是预期的行为。

但是,当用户右键单击并以管理员身份启动它时,代码返回 false。这是为什么呢?

private bool IsSingleInstanceOfSetupRunning()

    bool result = true;

    Process currentProcess = Process.GetCurrentProcess();
    if (Process.GetProcessesByName(currentProcess.ProcessName).Length > 1)
    
        result = false;
    

    return result;

【问题讨论】:

【参考方案1】:

WiX 引擎似乎检测到该进程以管理员身份运行,并启动了用于实际安装 MSI 的辅助进程。所以确实有两个同名的进程在运行。

在您的 CustomBA 代码调用 Engine.Apply() 后,您可以在非管理员进程中看到相同的行为。这通常是当引擎启动第二个提升的进程以处理实际的 MSI 安装时,用户看到 UAC 提示。

由于主进程已经以管理员身份运行,并且启动第二个进程不会出现 UAC 提示,因此引擎会继续并立即启动它,而不是等待对 Engine.Apply() 的调用。

另请注意:如果您正在执行重大升级,则在升级期间将运行先前版本的卸载(以静默模式),这将导致额外的过程。即使有另一个进程已经在运行(您的升级进程),您也需要确保允许卸载进程运行。

一种方法是使用互斥体进行检查,但仅在 DisplayMode Display.Full 中运行时:

if (DisplayMode == Display.Full)

    bool mutexCreated = false;
    mutex = new Mutex(true, @"My Installer F1096BB9-CFDF-4AD1-91D8-9AA8805784A8", out mutexCreated);
    if (!mutexCreated)
    
        MessageBox.Show("Another instance of the installer is already running. You may only run one at a time.",
                        "Installer already running", MessageBoxButton.OK,
                        MessageBoxImage.Warning);
        Log("Installer already running");
        Exit(ActionResult.NotExecuted);
    


public void Exit(ActionResult actionResult)


    if (mutex != null)
    
        mutex.Close();
        mutex = null;
    

    Log(string.Format("Exiting with code 0", actionResult));
    Engine.Quit((int) actionResult);    

【讨论】:

感谢您的详细回答。我决定在我的安装程序中省略单个实例检查。

以上是关于WiX 自定义引导程序 - 单实例检查的主要内容,如果未能解决你的问题,请参考以下文章

自定义 WiX Burn 引导程序用户界面?

Wix3.7 自定义引导程序不显示主题库中的 WPF 主题

带有自定义 /a 参数的 WiX 引导程序静默安装

如何防止 wix 自定义引导程序卸载 UI 在升级过程中显示

Wix Burn:自定义引导程序升级,但与旧版本并排安装

自定义引导程序作为单个实例