【发布时间】:2008-09-26 17:30:50
【问题描述】:
假设我正在尝试在 Windows 上自动安装某些东西,并且我想在尝试安装之前尝试测试是否正在进行另一个安装。我无法控制安装程序,必须在自动化框架中执行此操作。有没有比仅仅测试 msiexec 是否正在运行更好的方法,一些 win32 api?
[更新 2]
改进了我之前使用的直接访问互斥锁的代码,这更加可靠:
using System.Threading;
[...]
/// <summary>
/// Wait (up to a timeout) for the MSI installer service to become free.
/// </summary>
/// <returns>
/// Returns true for a successful wait, when the installer service has become free.
/// Returns false when waiting for the installer service has exceeded the timeout.
/// </returns>
public static bool WaitForInstallerServiceToBeFree(TimeSpan maxWaitTime)
{
// The _MSIExecute mutex is used by the MSI installer service to serialize installations
// and prevent multiple MSI based installations happening at the same time.
// For more info: http://msdn.microsoft.com/en-us/library/aa372909(VS.85).aspx
const string installerServiceMutexName = "Global\\_MSIExecute";
try
{
Mutex MSIExecuteMutex = Mutex.OpenExisting(installerServiceMutexName,
System.Security.AccessControl.MutexRights.Synchronize | System.Security.AccessControl.MutexRights.Modify);
bool waitSuccess = MSIExecuteMutex.WaitOne(maxWaitTime, false);
MSIExecuteMutex.ReleaseMutex();
return waitSuccess;
}
catch (WaitHandleCannotBeOpenedException)
{
// Mutex doesn't exist, do nothing
}
catch (ObjectDisposedException)
{
// Mutex was disposed between opening it and attempting to wait on it, do nothing
}
return true;
}
【问题讨论】:
-
当您打开没有 MutexRights.Modify 标志的现有互斥锁时,您无法释放互斥锁,因为您无法拥有它。来自msdn:MutexRights.Synchronize 允许线程在互斥体上等待,MutexRights.Modify 允许线程调用ReleaseMutex 方法。 msdn.microsoft.com/en-us/library/c41ybyt3.aspx
标签: c# windows windows-installer