You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core修改DLL默认目录失败,runtime probing配置无效如何解决?

问题根源与解决方案

你遇到的问题核心在于:.NET Core 不支持 .NET Framework 里的 <probing> 配置节点!那个app.config里的设置是给传统.NET Framework应用用的,.NET Core的程序集加载机制完全不同,所以加了也不会生效,程序还是只会在根目录找你的DLL文件。

下面给你几种可行的解决办法,按推荐程度排序:


方法1:修改 runtimeconfig.json 配置(最简单推荐)

.NET Core 用 [你的项目名].runtimeconfig.json 文件来配置程序集加载的额外路径,步骤如下:

  1. 找到你项目输出目录(bin\Debug\netcoreapp2.2)下的 [项目名].runtimeconfig.json 文件,如果没有,重新构建项目就会自动生成。
  2. 在 runtimeOptions 节点里添加 additionalProbingPaths 数组,指向你的lib文件夹:
    {
      "runtimeOptions": {
        "tfm": "netcoreapp2.2",
        "additionalProbingPaths": [
          "./lib"
        ],
        // 保留原有其他配置项
      }
    }
    
  3. 为了避免每次构建后这个文件被覆盖,最好直接在项目文件(.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:25:01