我有一个用 C# 为 .NET 8.0 编写的 Windows 服务。我编译程序,运行它,附加调试器并执行任何操作。当我停止它时,无论是通过使用服务并选择停止,还是只是在任务管理器中简单地终止该程序,都会发生同样的问题。我将对代码进行一些更改并尝试再次编译。我收到 10 条错误消息:
将文件从“a...MediaCoreService.dll”复制到 b...MediaCoreService.dll”该进程无法访问文件“bin\Debug” et8.0\MediaCoreService.dll',因为它正在被另一个进程使用。文件被锁定:“Microsoft Visual Studio 2022 Preview (30256)”
我每次都必须退出 VS 并重新返回,仅关闭解决方案也不起作用。在我基于 .NET Framework 的 Windows 服务上从未发生过这种情况,仅在 .NET Core 程序上发生过这种情况。我知道
.dll
与 .exe
但把它扔在那里。
有什么方法可以确保
.dll
被释放,这样我就不必每次都出去了?我尝试过 Clean Solution,奇怪的是,它成功完成,但之后又出现同样的错误。有没有办法从VS内部关闭MediaCoreService.dll
?
此问题经常出现的原因是 Windows 服务宿主进程锁定了 DLL 文件,而当服务停止或强制终止时,Visual Studio (VS) 没有正确释放它。您可以尝试使用以下几种策略来解决此问题,而无需重新启动 Visual Studio:
确保调试正确分离 停止服务后,确保正确分离调试器。在 Visual Studio 中,转到“调试”>“停止调试”或按 Shift+F5。 确认 MediaCoreService.dll 进程不再在任务管理器或资源监视器中运行。
使用临时部署路径 在调试期间,将服务配置为从临时文件夹而不是 bin 目录复制并运行。您可以通过修改项目的构建事件或使用 .runsettings 文件来完成此操作。
使用手柄实用程序手动解锁 使用 Sysinternals Handle 检查哪个进程锁定了文件
handle MediaCoreService.dll
使用进程 ID (PID) 手动解锁文件。
修改托管代码以防止 DLL 锁定。 将您的服务逻辑包装在 try-finally 块中以确保正确的清理:
public static void Main(string[] args) {
try
{
CreateHostBuilder(args).Build().Run();
}
finally
{
// Cleanup resources to release file locks.
}
}