看來,維克斯引擎檢測到進程正在運行爲管理和旋轉起來用於實際安裝的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);
}
感謝詳細的解答。我決定在安裝程序中省略單實例檢查。 –