ASP.NET Core开发时IIS文件锁定问题:如何配置避免重建失败?
老哥,你遇到的这个问题我太熟了!ASP.NET Core里IIS/IIS Express锁定bin文件夹DLL导致构建失败的情况,确实和传统ASP.NET(比如你说的VS2015那种常规项目)不一样——传统项目默认启用了影子复制机制,会加载DLL的副本,原文件自然能随便改;但Core默认没开这个,加上InProcess托管模式下IIS直接攥着原DLL不放,就会出现构建失败的情况。
给你几个不用终止进程就能解决的配置方案:
方案1:启用影子复制(最贴合传统ASP.NET的思路)
直接让IIS/IIS Express加载DLL的副本,原文件就可以被替换了。
针对IIS Express(Visual Studio里用的):
打开项目的.csproj文件,添加这段配置:<PropertyGroup> <UseShadowCopyFiles>true</UseShadowCopyFiles> </PropertyGroup>或者更简单,在Visual Studio的项目属性→调试选项卡里,找“启用影子复制”的勾选框(不同VS版本位置可能稍变,但肯定有类似选项),勾上就行。
针对本地IIS:
编辑站点的web.config,在<aspNetCore>节点里加上shadowCopyBinAssemblies="true":<aspNetCore processPath="dotnet" arguments=".\YourApp.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="InProcess" shadowCopyBinAssemblies="true" />注意:如果你的项目是OutOfProcess托管模式,影子复制默认可能已经生效,但InProcess模式必须手动开。
方案2:切换到OutOfProcess托管模式
ASP.NET Core的InProcess模式下,IIS进程(w3wp.exe)会直接加载DLL,锁定概率极高;而OutOfProcess模式下,应用是作为独立的dotnet进程运行,IIS只做反向代理,这种情况下不仅锁定概率低,就算偶尔锁定,重建时系统也会自动重启dotnet进程(不用你手动杀)。
修改方式有两种:
- 改
web.config的hostingModel:<aspNetCore processPath="dotnet" arguments=".\YourApp.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="OutOfProcess" /> - 或者在
.csproj里配置:<PropertyGroup> <AspNetCoreHostingModel>OutOfProcess</AspNetCoreHostingModel> </PropertyGroup>
额外提醒:检查第三方组件
你提到最近添加了Deve...(猜是DevExpress这类工具?),有些第三方组件的设计时工具或者运行时缓存可能会额外锁定DLL,导致问题更严重。建议去查一下这个组件的官方文档,看看有没有禁用文件锁定的配置,或者更新到最新版本——很多组件的新版本已经修复了这类锁定问题。
总结一下,最推荐的是启用影子复制或者切换到OutOfProcess模式,这俩方案都能让你在网站正常运行的情况下顺利完成构建,不用再手动杀进程啦!
内容的提问来源于stack exchange,提问作者herme 0

