在C#中卸载时如何检查 。exe上的锁是否已释放?

问题描述 投票:2回答:1

[尝试卸载应用程序时,我们尝试首先停止该服务并确保WaitForStatus报告成功。然后我们用sc delete删除它们,但有时并非所有文件都从安装的文件夹中删除。我们可以手动删除它们,但是大约需要几秒钟,这也会导致另一台PC的差异。在这里,我们认为Windows正在保留/锁定某些文件(主要是service.exe),因此无法删除它们和所有其他相关文件。

[我们想要实现的是在成功删除<service>.exe之后,我们要检查(例如,在while循环中)锁是否仍在<service>.exe上,如果这样,请睡眠2秒钟,然后重新执行-检查直到其释放,然后继续卸载文件。这可能需要大约30秒的时间,但是由于每个PC的不同,我们希望其功能强大,而不是随机等待。我们如何检查文件(service.exe)是否已锁定?从我的研究中,我没有看到直接的解决方案。每个人都建议检查file.Open (FileMode.Open, FileAccess.Read, FileShare.None)。这似乎是不必要的。有直接的解决方法吗?

下面是我关于如何停止和删除服务的代码。

try
{
   service= new ServiceController(serviceName);
   service.Stop();
   service.WaitForStatus(ServiceControllerStatus.Stopped, new TimeSpan(0, 0, 60));
   service.Refresh();
   if (service.Status == ServiceControllerStatus.Stopped)
   {
        //runs command with sc delete 'servicename'
        return RunCommand("cmd.exe", "/c sc delete \"" + serviceName + "\"");
   }
}
catch()
{
 ...
}
c# windows service locking uninstall
1个回答
0
投票

对于某些可能感兴趣的人,因此我们通过尝试在while循环中删除service.exe,然后重试直至删除,解决了此问题。重试之前,我们会睡1秒钟。我们还应限制重试次数,否则最终将冻结卸载。希望这可以帮助具有类似用例的人

© www.soinside.com 2019 - 2024. All rights reserved.