.NET 6迁移至.NET 8后bin目录缺失部分Microsoft.Extensions相关DLL
问题概述
项目从.NET 6迁移到.NET 8后,bin\Debug目录中缺失了一批依赖DLL(清单见下方),项目可正常构建,但运行应用或PowerShell模块时会抛出类似错误:
Could not load file or assembly 'Microsoft.Extensions.Http, Version=8.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'. The system cannot find the file specified.
缺失的DLL清单:
- Microsoft.Extensions.Caching.Abstractions.dll
- Microsoft.Extensions.Caching.Memory.dll
- Microsoft.Extensions.Configuration.Abstractions.dll
- Microsoft.Extensions.Configuration.Binder.dll
- Microsoft.Extensions.Configuration.dll
- Microsoft.Extensions.Configuration.FileExtensions.dll
- Microsoft.Extensions.Configuration.Json.dll
- Microsoft.Extensions.DependencyInjection.Abstractions.dll
- Microsoft.Extensions.DependencyInjection.dll
- Microsoft.Extensions.FileProviders.Abstractions.dll
- Microsoft.Extensions.FileProviders.Physical.dll
- Microsoft.Extensions.FileSystemGlobbing.dll
- Microsoft.Extensions.Http.dll
- Microsoft.Extensions.Logging.Abstractions.dll
- Microsoft.Extensions.Logging.dll
- Microsoft.Extensions.Options.dll
- Microsoft.Extensions.Primitives.dll
- System.Security.Cryptography.Pkcs.dll
- System.Text.Encodings.Web.dll
解决方法
1. 强制设置依赖包的复制本地属性
右键项目→编辑项目文件(.csproj),为缺失的对应NuGet包添加CopyLocal="true"配置,确保构建时将DLL复制到输出目录。示例:
<PackageReference Include="Microsoft.Extensions.Http" Version="8.0.0"> <CopyLocal>true</CopyLocal> </PackageReference>
注:需对所有缺失的DLL对应的NuGet包逐一配置,或直接批量添加该属性
2. 全局启用锁定文件依赖复制
在项目文件的<PropertyGroup>节点中添加以下配置,强制将所有NuGet锁定文件中的依赖组件复制到输出目录:
<PropertyGroup> <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> </PropertyGroup>
这个配置会覆盖默认的框架共享组件处理逻辑,确保所有依赖都被复制到bin目录。
3. 清理重建并重置NuGet缓存
- 手动删除项目的bin、obj目录
- 执行命令清理NuGet缓存:
dotnet nuget locals all --clear - 依次运行
dotnet restore和dotnet build,重新恢复并构建项目
4. 针对PowerShell模块的额外处理
如果是PowerShell模块场景,需在模块的.psd1文件中更新RequiredAssemblies列表,明确指定缺失DLL的路径,确保PowerShell加载模块时能找到依赖:
RequiredAssemblies = @( '.\Microsoft.Extensions.Http.dll', # 其他缺失DLL路径 )
问题原因说明
.NET 8对框架共享组件的分发逻辑做了优化,部分Microsoft.Extensions系列组件默认被标记为框架运行时共享组件,不会复制到项目输出目录。但如果项目依赖未通过NuGet正确引用,或部署环境缺少对应的.NET 8运行时组件,就会触发找不到DLL的错误。
内容的提问来源于stack exchange,提问作者Manjunatha Rao

