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