.NET Core修改DLL默认目录失败,runtime probing配置无效如何解决?
问题根源与解决方案
你遇到的问题核心在于:.NET Core 不支持 .NET Framework 里的 <probing> 配置节点!那个app.config里的设置是给传统.NET Framework应用用的,.NET Core的程序集加载机制完全不同,所以加了也不会生效,程序还是只会在根目录找你的DLL文件。
下面给你几种可行的解决办法,按推荐程度排序:
方法1:修改 runtimeconfig.json 配置(最简单推荐)
.NET Core 用 [你的项目名].runtimeconfig.json 文件来配置程序集加载的额外路径,步骤如下:
- 找到你项目输出目录(
bin\Debug\netcoreapp2.2)下的[项目名].runtimeconfig.json文件,如果没有,重新构建项目就会自动生成。 - 在
runtimeOptions节点里添加additionalProbingPaths数组,指向你的lib文件夹:{ "runtimeOptions": { "tfm": "netcoreapp2.2", "additionalProbingPaths": [ "./lib" ], // 保留原有其他配置项 } } - 为了避免每次构建后这个文件被覆盖,最好直接在项目文件(
.csproj)里配置,让构建时自动生成这个设置:
在.csproj里添加以下内容:
这样每次构建都会自动把<PropertyGroup> <RuntimeConfigAdditionalProbingPaths>$(OutputPath)lib</RuntimeConfigAdditionalProbingPaths> </PropertyGroup>lib目录加入到程序集探测路径里,一劳永逸。
方法2:用 AssemblyLoadContext 手动拦截加载(适合复杂场景)
如果需要更灵活的程序集加载控制(比如动态加载、按需加载),可以自定义程序集加载上下文,在程序启动时主动去lib目录找DLL:
在你的Program.cs里添加以下代码:
using System.Runtime.Loader; using System.IO; using System; namespace YourNamespace { class Program { static void Main(string[] args) { // 定义lib目录的路径 var libDirectory = Path.Combine(AppContext.BaseDirectory, "lib"); // 注册程序集解析事件:当找不到程序集时,自动去lib目录查找 AssemblyLoadContext.Default.Resolving += (context, assemblyName) => { var assemblyPath = Path.Combine(libDirectory, $"{assemblyName.Name}.dll"); if (File.Exists(assemblyPath)) { return context.LoadFromAssemblyPath(assemblyPath); } // 如果还是找不到,返回null让系统继续处理 return null; }; // 你的业务代码写在这里... } } }
方法3:检查你的生成后事件脚本
确保你的脚本没有把主程序文件(比如你的项目名.exe或者主项目的DLL)也移到lib目录里!主程序必须留在输出根目录,否则启动时系统连主程序都找不到。
推荐的生成后事件脚本可以写成这样(批处理):
:: 先创建lib目录(如果不存在) if not exist "$(TargetDir)lib" mkdir "$(TargetDir)lib" :: 移动所有DLL到lib,但排除主程序的DLL(假设主程序DLL和项目名一致) move "$(TargetDir)*.dll" "$(TargetDir)lib\" :: 如果是控制台应用,还要确保EXE留在根目录,上面的move不会动EXE,没问题
内容的提问来源于stack exchange,提问作者Maciej Małek
相关产品推荐
相关产品推荐

