调试后,Visual Studio 2022 保留 .NET Core 程序的 .dll,除非退出,否则我无法完成下一个构建。如何释放.dll?

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

我有一个用 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

c# .net-core visual-studio-2022
1个回答
0
投票

此问题经常出现的原因是 Windows 服务宿主进程锁定了 DLL 文件,而当服务停止或强制终止时,Visual Studio (VS) 没有正确释放它。您可以尝试使用以下几种策略来解决此问题,而无需重新启动 Visual Studio:

  1. 确保调试正确分离 停止服务后,确保正确分离调试器。在 Visual Studio 中,转到“调试”>“停止调试”或按 Shift+F5。 确认 MediaCoreService.dll 进程不再在任务管理器或资源监视器中运行。

  2. 使用临时部署路径 在调试期间,将服务配置为从临时文件夹而不是 bin 目录复制并运行。您可以通过修改项目的构建事件或使用 .runsettings 文件来完成此操作。

  3. 使用手柄实用程序手动解锁 使用 Sysinternals Handle 检查哪个进程锁定了文件

    handle MediaCoreService.dll
    使用进程 ID (PID) 手动解锁文件。

  4. 修改托管代码以防止 DLL 锁定。 将您的服务逻辑包装在 try-finally 块中以确保正确的清理:

    public static void Main(string[] args) {

     try
     {
         CreateHostBuilder(args).Build().Run();
     }
     finally
     {
         // Cleanup resources to release file locks.
     }
    

    }

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