将一个 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"
问题的原因找到了, 是项目中引用的 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
Microsoft.Extensions.ApiDescription.Server
只是帮助发现了运行时才能发现的问题