的过程.WaitForExit在运行另一个安装时挂起

本文关键字:安装 挂起 另一个 运行 过程 WaitForExit | 更新日期: 2023-09-27 18:14:42

大家好!我正在做安装程序,它使用Process.Start.

为我的软件安装额外的依赖项。
foreach dependency:
var process = System.Diagnostics.Process.Start(processStartInfo);
process.WaitForExit();

问题是当另一个msi安装运行时,WaitForExit挂起(当我关闭另一个msi安装时,WaitForExit也退出)。

我不能使用超时,因为依赖关系随着安装时间的不同而不同。

是否有任何方法来处理这种情况,并正确杀死进程(实际上我想知道是依赖正在安装或只是挂起)?多谢。

解决方案:在我的情况下,问题是通过检查'msiexec'进程是否正在运行来解决的。

的过程.WaitForExit在运行另一个安装时挂起

解决我的问题-检查全局互斥锁,由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