2011-11-16 4 views
0

안녕하세요! 저는 Process.Start를 사용하여 소프트웨어에 대한 추가 종속성을 설치하는 설치 프로그램에서 작업하고 있습니다.다른 설치를 실행하는 동안 프로세스가 종료됩니다.

foreach dependency: 
var process = System.Diagnostics.Process.Start(processStartInfo); 
process.WaitForExit(); 

문제는 다른 MSI 설치가 runned 때, 중단을 WaitForExit (그리고 나는이 또 다른 MSI 설치를 닫을 때, WaitForExit도 종료)입니다.

매우 다른 설치 시간으로 인해 종속성이 다르므로 시간 초과를 사용할 수 없습니다.

이 상황을 처리하고 올바르게 프로세스를 죽일 수있는 방법이 있습니까 (실제로 종속성이 설치되어 있는지 또는 걸려 있는지 알고 싶습니까?)? 많은 감사.

해결책 : 제 경우에는 'msiexec'프로세스가 실행 중인지 확인하여 문제가 해결됩니다.

+1

당신은 VS에서 설치 프로젝트를 사용하고 거기에 관련된 모든 종속성을 포함하지 않는 이유는? 또는 그냥 EXE/DLL에 임베드 할 수 있습니다 (.NET이라면 ​​메모리에서 실행할 수도 있습니다)? – Yahia

+0

모두가 .NET이 아니라 인터넷에서 종속성을 다운로드 할 수 있습니다. 설치 프로그램은 매우 크고 복잡합니다. 어쨌든 WaitForExit 걸기에 대한 질문. – rapt0r

+0

여전히 VS에서 설치 프로그램 프로젝트는 종속성을 설치할 수 있습니다 ... 직접 작성하지 않아도됩니다 ... – Yahia

답변

1

내 문제에 대한 해결책 - msiexec에서 만든 전역 뮤텍스를 확인하십시오. 이는 다른 msi 설치가 실행 중인지 확인하는 올바른 방법이기도합니다. 여기

public static bool WaitAnotherMsiInstallation(int timeout) 
    { 
     const string MsiMutexName = "Global\\_MSIExecute"; 

     try 
     { 
      using (var msiMutex = Mutex.OpenExisting(MsiMutexName, MutexRights.Synchronize)) 
      { 
       return msiMutex.WaitOne(timeout); 
      } 
     } 
     catch (WaitHandleCannotBeOpenedException) 
     { 
      // The named mutex does not exist. 
      return true; 
     } 
     catch (ObjectDisposedException) 
     { 
      // Mutex was disposed between opening it and attempting to wait on it 
      return true; 
     } 
    } 

은 몇 가지 세부 사항 http://msdn.microsoft.com/en-us/library/aa372909(VS.85).aspx

관련 문제