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 回答