c# - 在 C# 中卸载时,如何检查 <service>.exe 上的锁是否已释放?

标签 c# windows service locking uninstallation

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

我们要实现的是成功删除<service>.exe之后,我们想检查(比如,在 while 循环中)锁是否仍在 <service>.exe 上,如果是这样休眠2秒然后重新检查直到它被释放然后继续卸载文件。这可能需要大约 30 秒,但由于它因个人电脑而异,我们希望稳健而不是随机等待。 我们如何检查文件(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()
{
 ...
}

最佳答案

对于一些可能感兴趣的人,我们通过尝试在 while 循环中删除 service.exe 来解决这个问题,然后重新尝试直到它被删除。在重试之前我们睡了 1 秒。我们还应该限制重试次数,否则我们可能最终会卡住卸载。希望这对有类似用例的人有帮助

关于c# - 在 C# 中卸载时,如何检查 <service>.exe 上的锁是否已释放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58599022/

相关文章:

c# - 将 BitmapImage 保存到文件

c++ - 如何隐藏窗口的菜单栏?

ios - 如何在 Ionic 应用程序中添加后台服务

rest - 是否可以缓存服务器对服务器 HTTP POST 请求的响应?

java - 服务在单次广播中触发数百次

c# - 私有(private)成员的 DataMember 属性 - 幕后发生了什么

c# - 由于文本框内容而导致的 PageRequestManagerServerErrorException

.net - 如何安全地将文件保存到磁盘而没有被 Windows 拒绝的风险?

Windows Azure 移动服务

C#比较私有(private)静态和公共(public)静态方法