.NET 8发布后从dependencies文件夹加载依赖的解决方案
解决方案:将.NET 8项目依赖发布到指定文件夹并配置加载路径
方案1:通过项目文件(.csproj)直接配置
这是最直接的方案,无需编写额外代码,直接修改项目配置即可实现依赖输出到dependencies/并让运行时自动加载:
- 修改项目的
.csproj文件,添加以下配置:
<PropertyGroup> <!-- 启用本地复制锁定文件程序集 --> <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> <!-- 指定依赖输出到dependencies文件夹 --> <RuntimeDependenciesOutputPath>dependencies</RuntimeDependenciesOutputPath> <!-- 自动生成runtime配置文件 --> <GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles> </PropertyGroup> <!-- 确保所有NuGet包都复制到指定目录 --> <ItemGroup> <PackageReference Update="*" CopyLocal="true" /> <!-- 告诉运行时去dependencies目录探测依赖 --> <RuntimeHostConfigurationOption Include="PROBING_PATH" Value="dependencies" /> </ItemGroup>
- 执行发布命令:
dotnet publish -c Release -o ./publish
发布完成后,publish目录下会生成根目录的可执行文件,以及dependencies/文件夹(包含所有NuGet依赖的.dll文件),运行时会自动从该文件夹加载依赖。
方案2:手动修改运行时配置文件
如果不想修改项目文件,也可以通过发布后修改runtimeconfig.json实现:
- 执行带参数的发布命令,指定依赖输出目录:
dotnet publish -c Release -o ./publish /p:RuntimeDependenciesOutputPath=dependencies /p:CopyLocalLockFileAssemblies=true
- 打开
publish目录下的<你的项目名>.runtimeconfig.json,在runtimeOptions.configProperties中添加探测路径配置:
{ "runtimeOptions": { "tfm": "net8.0", "framework": { "name": "Microsoft.NETCore.App", "version": "8.0.0" }, "configProperties": { "PROBING_PATH": "dependencies" } } }
为什么AssemblyResolve方案无效?
在.NET 5+(包括.NET 8)中,运行时会在Main方法执行前提前加载必要的依赖程序集(框架依赖、项目引用的NuGet包等),因此即使在Main最顶部注册AssemblyResolve事件,也赶不上初始的依赖加载流程,导致该方案失效。上面的方案都是通过提前配置运行时的探测路径,从根源上解决依赖加载的路径问题。
内容的提问来源于stack exchange,提问作者godmodule
相关产品推荐
相关产品推荐

