配置.NET 6+IIS的shadow copy后dll仍被锁定如何解决
.NET 6 IIS环境下shadow copy功能dll锁定问题解决方案
常规排查步骤
- 确认web.config配置位置正确性
handlerSettings节点必须嵌套在aspNetCore节点内部,完整正确配置示例如下:
建议优先使用绝对路径配置shadowCopyDirectory,避免相对路径解析异常导致功能失效。<configuration> <system.webServer> <handlers> <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" /> </handlers> <aspNetCore processPath="dotnet" arguments=".\你的项目.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess"> <handlerSettings> <handlerSetting name="experimentalEnableShadowCopy" value="true" /> <handlerSetting name="shadowCopyDirectory" value="C:\绝对路径\ShadowCopyDirectory\" /> </handlerSettings> </aspNetCore> </system.webServer> </configuration> - 验证基础环境配置
- 对应IIS应用池的.NET CLR版本需设置为「无托管代码」
- 确认.NET 6 Hosting Bundle安装顺序正确:必须先安装IIS服务,再安装Hosting Bundle,顺序颠倒会导致ASP.NET Core模块注册异常,需重新安装Hosting Bundle修复
- 如果你运行的是.NET 5项目,建议将项目框架升级至.NET 6,该实验性功能对低版本.NET的适配存在已知兼容问题
- 检查目录权限
给站点根目录、ShadowCopy目录都添加对应应用池身份(格式为IIS AppPool\你的应用池名称)的读取、写入、执行权限。 - 调整IIS应用池配置
关闭应用池的「重叠回收」功能,同时开启「禁用重叠回收」选项,避免旧进程未退出时仍持有原目录dll的句柄。
兜底解决方案
如果以上配置都正确仍存在锁定问题,可在项目.csproj文件中添加编译钩子,编译前后自动启停对应IIS应用池,配置示例如下:
<Target Name="StopAppPool" BeforeTargets="PreBuildEvent"> <Exec Command="%windir%\system32\inetsrv\appcmd stop apppool /apppool.name:\"你的应用池名称\"" /> </Target> <Target Name="StartAppPool" AfterTargets="PostBuildEvent"> <Exec Command="%windir%\system32\inetsrv\appcmd start apppool /apppool.name:\"你的应用池名称\"" /> </Target>
使用该方案需要运行Visual Studio的账号拥有IIS操作权限。
内容的提问来源于stack exchange,提问作者Chris Roberts
相关产品推荐
相关产品推荐

