2013-10-21 4 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

WiX Engine은 프로세스가 관리자로 실행 중이며 실제로 MSI를 설치하는 데 사용되는 보조 프로세스를 실행하는 것으로 나타납니다. 그래서 실제로 같은 이름으로 실행되는 두 개의 프로세스가 있습니다.

CustomB 코드가 Engine.Apply()를 호출하면 비 관리자 프로세스에서 동일한 동작을 볼 수 있습니다. 이는 일반적으로 Engine이 실제 MSI 설치를 처리하기 위해 상승 된 두 번째 프로세스를 실행하기 때문에 사용자가 UAC 프롬프트를 볼 때 발생합니다.

주 프로세스가 이미 admin으로 실행 중이므로 두 번째 프로세스를 회전하여 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

감사합니다. 설치 프로그램에서 단일 인스턴스 검사를 생략하기로 결정했습니다. –