dotnet publish 错误:该进程无法访问该文件,因为它正被另一个进程使用

Posted

技术标签:

【中文标题】dotnet publish 错误:该进程无法访问该文件,因为它正被另一个进程使用【英文标题】:dotnet publish Error: The process cannot access the file because it is being used by another process 【发布时间】:2019-11-25 11:32:26 【问题描述】:

尝试运行dotnet publish时出现以下错误:

进程无法访问该文件,因为它正被另一个进程使用 过程。

当您尝试发布您的应用并且您一直在浏览器中查看已发布的版本时,似乎会发生这种情况,由于某种原因它会锁定文件。

完整的错误信息:

C:\Program Files\dotnet\sdk\2.2.301\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Publish.targets(169,5):警告 MSB3026:无法复制“obj\Debug \netcoreapp2.2\TemplateWebApp.dll”到“bin\Debug\netcoreapp2.2\publish\TemplateWebApp.dll”。在 1000 毫秒内开始重试 1。该进程无法访问文件 '\cpft-bi-web01\d$\Websites\TemplateWebApp\bin\Debug\netcoreapp2.2\publish\TemplateWebApp.dll',因为它正被另一个进程使用。 [\cpft-bi-web01\d$\Websites\TemplateWebApp\TemplateWebApp.csproj]

我可以通过关闭浏览器并在 IIS 管理器上重新启动网站来解决此问题,但这确实不太理想,有人知道这是什么原因吗?

【问题讨论】:

您发布到的目标是否与您的 IIS 网站的发布文件夹相同? ...如果是这样,那么请看这里(并检查其有关“网络部署”的 cmets):***.com/questions/15276978/… 还有这个,可能是重复的:***.com/questions/41829158/net-core-locking-files @LGSon 是的,我发布到的目标和 IIS 指向的文件夹是相同的,谢谢,我会研究 web 部署。 【参考方案1】:

为了解决这个问题,我回收了apppool。

在本地环境中,我有一个构建后事件Project -> Properties -> Build Events -> Post-build event command line,它运行位于项目目录中的.bat 文件。

这是来自bat文件的代码:

%SYSTEMROOT%\System32\inetsrv\appcmd recycle apppool /apppool.name:"YOUR APP POOL NAME"
dotnet publish --force --no-build
pause

只需确保将 YOUR APP POOL NAME 替换为您的实际池名称(并保留双引号)

所以每次我构建解决方案时,它都会回收池并发布应用程序。因为我只是构建应用程序(在发布之前),我指定--no-build 来发布命令。

【讨论】:

这个解决方案对我不起作用。输出窗口显示“MyAppPool 已成功回收”,但我仍然收到有关正在使用的 DLL 的错误。手动回收应用程序池可以修复它,但这不是每次发布都必须回收它的解决方案!【参考方案2】:

我有同样的错误。停止 IIS 上的应用程序池,然后发布,然后再次启动池对我有用。

【讨论】:

这个答案让我找到了我的解决方案。我的不会发布的网站甚至没有在 IIS 中设置,但停止 www 服务使发布能够顺利完成。

以上是关于dotnet publish 错误:该进程无法访问该文件,因为它正被另一个进程使用的主要内容,如果未能解决你的问题,请参考以下文章

无法启动进程 dotnet.exe

无法启动 dotnet 核心进程。添加工具失败

dotnet publish 不使用 appsettings.json

如何覆盖 dotnet publish 的目标文件夹

如何将 blazor 客户端/服务器应用程序发布到 linux Web 服务器?无权访问 ssh 并且 dotnet publish 不提供 index.html

构建错误:“该进程无法访问该文件,因为它正在被另一个进程使用”