ASP.NET Core 6.0 Web应用控制器映射时请求类型加载失败求助
ASP.NET Core 6.0程序集引用冲突导致类型加载失败的排查方案
问题概述
- 在ASP.NET Core 6.0 Web应用的
Startup.cs中配置控制器映射时,触发错误:Unable to load one or more of the requested types - 项目已通过项目引用引入
QESI.Accuracy.Contract程序集,此前使用该项目内类无异常 - 该程序集同时被打包为NuGet包供其他解决方案使用,推测系统错误加载NuGet包版本而非项目引用,引发冲突
- 将项目程序集名称后缀改为“2”后,出现「同一类型存在于两个程序集」的错误,证实存在对该NuGet包1.1.58版本的隐性引用
- 已按微软官方文档清理所有NuGet缓存,问题未得到解决
排查与解决步骤
1. 梳理依赖关系,定位隐性引用
- 执行
dotnet list package命令,查看项目的所有NuGet依赖,确认是否有第三方包间接引用了QESI.Accuracy.Contract1.1.58版本 - 检查Web项目的
.csproj文件及解决方案级的packages.config,排查是否存在该NuGet包的显性引用,若有直接移除
2. 强制锁定项目引用优先级
- 在Web项目的
.csproj中,为项目引用添加PrivateAssets="All"属性,避免被其他依赖传递引用:<ProjectReference Include="..\QESI.Accuracy.Contract\QESI.Accuracy.Contract.csproj"> <PrivateAssets>All</PrivateAssets> </ProjectReference> - 在项目的
<PropertyGroup>节点中添加配置,禁用传递性项目引用:<PropertyGroup> <DisableTransitiveProjectReferences>true</DisableTransitiveProjectReferences> </PropertyGroup>
3. 清理本地编译文件与重新构建
- 删除Web项目根目录下的
bin和obj文件夹 - 依次执行
dotnet clean、dotnet restore命令,再重新生成整个解决方案
4. 启用程序集加载日志,定位加载来源
- 通过以下步骤生成程序集加载日志,明确系统实际加载的程序集路径:
- 打开命令提示符,执行
set COMPLUS_LoadFromRemoteSources=1 - 执行
set COMPLUS_LogAssemblyBindings=1 - 启动Web应用,查看生成的
fusionlog.dll日志,确认加载的是项目编译后的程序集还是NuGet包内的程序集
- 打开命令提示符,执行
5. 清理IDE缓存,避免旧引用残留
- 关闭Visual Studio
- 删除
%LOCALAPPDATA%\Microsoft\VisualStudio\<你的VS版本号>\ComponentModelCache目录下的所有文件 - 重新打开解决方案并完成构建
内容的提问来源于stack exchange,提问作者Ryan Langton
相关产品推荐
相关产品推荐

