进程被杀死后,DLL仍然处于锁定状态

时间:2014-10-19 14:44:11

标签: .net windows powershell dll handle

我尝试使用PowerShell自动部署Windows服务。我遇到问题的步骤是停止当前版本并将其删除。

由于它是CI代理,我根本不关心正确停止服务,所以我只是用taskkill /f /im:<exe name>来终止这个过程。然后我尝试删除文件,大约3次我得到这个:

Exception: Access to the path 'C:\Program Files (x86)\MirrorService\AWSSDK.dll' is denied.

但DLL只被我刚刚杀死的进程使用。我试图捕获异常并记录handle.exe输出。日志中没有此DLL的句柄,我可以将其删除。

所以,显然在taskkill完成工作和处理释放之间存在滞后。等待它的最简洁方法是什么?这是我到目前为止所提出的,而且对我来说看起来都不够干净:

  • taskkillrm
  • 之间放置延迟(多长时间?)
  • 捕获异常并在暂停后重试rm
  • 使用handle.exe / Unlocker释放DLL

PS:我已经尝试了使用stop-servicewait-process停止服务的更好方法,结果是相同的

UPD :在停止服务和删除文件之间延迟300毫秒似乎可以解决问题,但我仍在寻找(1)行为解释和(2)a更可靠的方法来确保dll被释放。

1 个答案:

答案 0 :(得分:1)

有时句柄在服务本身报告后停止打开&#34;停止&#34;。这将检查你的.dll是否有任何迷路手柄,如果找到,它会修复它们。

$lockedFile="C:\Program Files (x86)\MirrorService\AWSSDK.dll"

GPS|%{$LOCK = $_;$_.Modules|%{If($_.FileName -eq "$lockedFile"){Kill -id $LOCK.id -force}}}