0

良い一日!私はインストーラーに取り組んでいます。インストーラーは、Process.Startを使用してソフトウェアの追加の依存関係をインストールします。

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

問題は、別のmsiインストールが実行されると、WaitForExitがハングすることです(この別のmsiインストールを閉じると、WaitForExitも終了します)。

インストール時間が非常に異なるため、依存関係が異なるため、タイムアウトを使用できません。

この状況を処理してプロセスを正しく強制終了する方法はありますか(実際には、依存関係がインストールされているのか、単にハングしているのかを知りたいです)?どうもありがとう。

解決策:私の場合、問題は「msiexec」プロセスが実行されているかどうかを確認することで解決されます。

4

1 に答える 1

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

于 2011-12-30T10:54:53.380 に答える