2013-10-21 53 views
2

我使用以下代碼檢查CustomBA的單實例是否已在CustomBA的運行塊中運行。WiX自定義引導程序 - 單實例檢查

當用戶通過雙擊啓動「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; 
} 

回答

3

看來,維克斯引擎檢測到進程正在運行爲管理和旋轉起來用於實際安裝的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);  
} 
+0

感謝詳細的解答。我決定在安裝程序中省略單實例檢查。 –