切换TargetFramework至net6.0后引用本地DLL引发文件未找到异常
问题原因分析
.NET Framework和.NET 6(属于.NET Core系列)的程序集引用与依赖处理机制存在本质差异:
- 在.NET Framework中,直接引用本地DLL时,构建系统会自动解析该DLL的所有依赖项(包括其引用的NuGet包),并将这些依赖复制到输出目录,这就是你之前能正常运行的原因。
- 而在.NET 6+中,本地文件引用(
<Reference>)属于**“裸引用”**,构建系统不会自动解析或复制该DLL的依赖项。它默认只处理项目引用(<ProjectReference>)和NuGet包引用的传递依赖,因此ProjectA的输出目录里只会有ProjectB.dll本身,缺少其依赖的NuGet包DLL,导致运行时抛出文件未找到异常。
解决方案
1. 最佳实践:改用项目引用
如果两个项目属于同一解决方案(或可以添加到同一解决方案),直接替换本地DLL引用为项目引用,这是.NET Core+推荐的引用方式,能自动处理所有传递依赖:
修改ProjectA的csproj中的引用部分:
<ItemGroup> <ProjectReference Include="..\..\SolutionB\ProjectB\ProjectB.csproj" /> </ItemGroup>
这样构建时,ProjectA会自动构建ProjectB(如果未构建),并将ProjectB及其所有依赖的NuGet包DLL复制到自己的输出目录,完全复刻.NET Framework时期的效果。
2. 若必须使用本地DLL引用的替代方案
如果无法使用项目引用,有两种方式解决依赖问题:
- 显式引用依赖的NuGet包:在ProjectA的csproj中,添加ProjectB所依赖的所有NuGet包引用,这样构建时这些包的DLL会被复制到输出目录。
- 手动复制依赖项:在ProjectA的csproj中添加自定义构建任务,将ProjectB输出目录中的所有依赖DLL复制到ProjectA的输出目录。示例:
<Target Name="CopyProjectBDependencies" AfterTargets="Build"> <Copy SourceFiles="..\..\SolutionB\ProjectB\bin\Release\net6.0\*.dll" DestinationFolder="$(OutputPath)" SkipUnchangedFiles="true" /> </Target>
注意:这种方式需要确保ProjectB的输出目录包含所有依赖DLL,且路径正确。
内容的提问来源于stack exchange,提问作者suseal
相关产品推荐
相关产品推荐

