部署ASP.NET Web Forms至IIS 10遇CodeDom提供程序定位失败求助
以下是几种可能的原因及排查方向:
程序集版本不匹配:虽然已部署
Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll,但实际dll的版本可能和web.config中指定的2.0.1.0不一致。右键查看bin目录下该dll的属性(详细信息里的产品版本),对比web.config中<system.codedom>节点里的版本号,若不符,要么更新web.config的版本配置,要么重新部署对应版本的dll。依赖组件遗漏:
Microsoft.CodeDom.Providers.DotNetCompilerPlatform依赖Microsoft.Net.Compilers包,仅部署单个dll不够,还需确保bin目录下的roslyn子目录(包含csc.exe、vbc.exe等编译器工具)以及相关依赖dll(如Microsoft.CodeDom.Providers.DotNetCompilerPlatform.resources.dll)都已部署到IIS站点。Visual Studio运行时会自动加载这些组件,但手动部署时容易遗漏roslyn目录。应用程序池权限不足:IIS应用程序池的运行身份可能没有读取bin目录下dll的权限。检查应用程序池的身份设置(比如是否为ApplicationPoolIdentity),给站点的bin目录添加IIS_IUSRS组的读取权限,或者切换应用程序池身份为具有读取权限的账户。
全局程序集缓存冲突:服务器GAC(全局程序集缓存)中可能存在其他版本的
Microsoft.CodeDom.Providers.DotNetCompilerPlatform程序集,导致IIS优先加载GAC里的版本而非bin目录下的。可以通过命令gacutil -l Microsoft.CodeDom.Providers.DotNetCompilerPlatform查看GAC中的版本,若有冲突,要么移除GAC中的对应版本,要么在web.config中添加<assemblyBinding>节点指定优先加载本地bin目录的程序集。web.config配置错误:检查web.config的
<system.codedom>节点,确认程序集名称、PublicKeyToken、版本号是否和实际dll完全匹配,是否存在拼写错误。比如PublicKeyToken是否为31bf3856ad364e35,版本号是否和dll一致,任何一处不匹配都会导致无法定位类型。
内容的提问来源于stack exchange,提问作者Victor Sotnikov

