gpt4 book ai didi

WiX 自定义 Bootstrap - 单实例检查

转载 作者:行者123 更新时间:2023-12-04 04:37:26 25 4
gpt4 key购买 nike

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

当用户通过双击启动“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;
}

最佳答案

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

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

由于主进程已经以管理员身份运行,并且不会通过启动第二个进程出现 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 自定义 Bootstrap - 单实例检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19498396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com