首页 新闻 会员 周边

Microsoft.Extensions.ApiDescription.Server 出现 "Could not load type" 问题

0
悬赏园豆:30 [已解决问题] 解决于 2024-01-29 12:42

将一个 ASP.NET Core 项目升级到 .NET 8 并且更新所有 nuget 包之后 build 时出现下面的错误:

C:\Users\Administrator\.nuget\packages\microsoft.extensions.apidescription.server\8.0.1\build\Microsoft.Extensions.ApiDescription.Server.targets(66,5): error : System.Reflection.ReflectionTypeLoadException: Unable to load one or more of the requested types. [C:\dev\cnblogs\account\src\Cnblogs.Account.WebApi\Cnblogs.Account.WebApi.csproj]
C:\Users\Administrator\.nuget\packages\microsoft.extensions.apidescription.server\8.0.1\build\Microsoft.Extensions.ApiDescription.Server.targets(66,5): error : Could not load type 'Cnblogs.Architecture.Ddd.EventBus.Abstractions.IEventBusHandler' from assembly 'Cnblogs.Architecture.Ddd.EventBus.Abstractions, Version=20.2.0.0, Culture=neutral, PublicKeyToken=null'. [C:\dev\cnblogs\account\src\Cnblogs.Account.WebApi\Cnblogs.Account.WebApi.csproj]

如果禁用 OpenApiGenerateDocumentsOnBuild,就不会出现这个问题

<OpenApiGenerateDocumentsOnBuild>false</OpenApiGenerateDocumentsOnBuild>
问题补充:

OpenApiGenerateDocumentsOnBuild 对应的命令

    dotnet "C:\Users\Administrator\.nuget\packages\microsoft.extensions.apidescription.server\8.0.1\build\../tools/dotnet-getdocument.dll" 
    --assembly "C:\dev\cnblogs\account\src\Cnblogs.Account.WebApi\bin\Debug\net8.0\Cnblogs.Account.WebApi.dll" 
    --file-list "obj\Cnblogs.Account.WebApi.OpenApiFiles.cache" 
    --framework ".NETCoreApp,Version=v8.0" 
    --output "obj" 
    --project "Cnblogs.Account.WebApi" 
    --assets-file "C:\dev\cnblogs\account\src\Cnblogs.Account.WebApi\obj\project.assets.json" 
    --platform "AnyCPU"
dudu的主页 dudu | 高人七级 | 园豆:30994
提问于:2024-01-29 10:11
< >
分享
最佳答案
0

问题的原因找到了, 是项目中引用的 Cnblogs.Architecture 相关 nuget 包版本不一致引起的

Cnblogs.Architecture.Ddd.Cqrs.DependencyInjection.EventBus.Dapr 16.4.0 只有 .NET 7.0 的版本(这个包后来废弃了),它依赖了 Cnblogs.Architecture.Ddd.Cqrs.DependencyInjection,但最新的 Cnblogs.Architecture.Ddd.Cqrs.DependencyInjection 只支持 .NET 8.0

在加载 Cnblogs.Architecture.Ddd.Cqrs.DependencyInjection.EventBus.Dapr 时想要加载 .NET 7.0 版的 Cnblogs.Architecture.Ddd.Cqrs.DependencyInjection,但只有 .NET 8.0 版的,结果就 Could not load type

如果 Cnblogs.Architecture.Ddd.Cqrs.DependencyInjection 打包时同时生成支持 .NET 7.0 版的包就可以避免这个问题

<TargetFrameworks>net7.0;net8.0</TargetFrameworks>

最终采用的解决方法是用 .NET 8.0 版的 Cnblogs.Architecture.Ddd.EventBus.Dapr 替换 Cnblogs.Architecture.Ddd.Cqrs.DependencyInjection.EventBus.Dapr

dudu | 高人七级 |园豆:30994 | 2024-01-29 12:40

Microsoft.Extensions.ApiDescription.Server 只是帮助发现了运行时才能发现的问题

dudu | 园豆:30994 (高人七级) | 2024-01-29 12:46
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册