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

.NET Core 3.1类库被控制台引用时读取自身appsetting.json的方法

.NET Core 3.1类库读取自身appsettings.json的解决方案

问题根源

类库被项目引用后,运行时的当前工作目录是主控制台应用的bin目录,而非类库自身的输出目录,默认配置加载逻辑会从当前工作目录查找文件,因此找不到类库的appsettings.json。

解决方案

方案1:将类库的appsettings.json复制到主程序输出目录并定位加载

  1. 修改类库中appsettings.json的复制属性

    • 在Visual Studio中右键类库的appsettings.json → 属性 → 高级 → 「复制到输出目录」选择「如果较新则复制」或「始终复制」。
    • 或者手动编辑类库的.csproj文件,添加以下配置:
      <ItemGroup>
        <None Update="appsettings.json">
          <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </None>
      </ItemGroup>
      

    这一步会确保类库的配置文件被同步复制到主控制台应用的bin目录中。

  2. 在ConfigHelper中基于类库程序集路径加载配置
    不要依赖Environment.CurrentDirectory,而是通过类库自身的程序集获取路径,确保找到正确的配置文件:

    using Microsoft.Extensions.Configuration;
    using System.IO;
    using System.Reflection;
    
    public class ConfigHelper
    {
        public static IConfiguration GetCurrentSettings()
        {
            // 获取类库程序集的所在目录
            var assembly = Assembly.GetExecutingAssembly();
            var assemblyDirectory = Path.GetDirectoryName(assembly.Location);
            
            // 拼接类库配置文件的完整路径
            var configFilePath = Path.Combine(assemblyDirectory, "appsettings.json");
            
            return new ConfigurationBuilder()
                .SetBasePath(assemblyDirectory)
                .AddJsonFile(configFilePath, optional: false, reloadOnChange: true)
                .Build();
        }
    }
    

    注意:类库需要安装Microsoft.Extensions.Configuration和Microsoft.Extensions.Configuration.Json这两个NuGet包。

方案2:将appsettings.json嵌入为类库资源(无需复制文件)

如果不想让配置文件暴露在输出目录中,可以将其嵌入到类库dll里:

  1. 设置appsettings.json为嵌入资源

    • 在Visual Studio中右键类库的appsettings.json → 属性 → 「生成操作」选择「嵌入的资源」。
    • 或编辑.csproj:
      <ItemGroup>
        <EmbeddedResource Include="appsettings.json" />
      </ItemGroup>
      
  2. 从嵌入资源中加载配置

    using Microsoft.Extensions.Configuration;
    using System.IO;
    using System.Reflection;
    
    public class ConfigHelper
    {
        public static IConfiguration GetCurrentSettings()
        {
            var assembly = Assembly.GetExecutingAssembly();
            // 资源名称格式:类库命名空间 + 文件名(例如:MyCustomLibrary.appsettings.json)
            var resourceName = "MyCustomLibrary.appsettings.json";
            
            using var configStream = assembly.GetManifestResourceStream(resourceName);
            
            return new ConfigurationBuilder()
                .AddJsonStream(configStream)
                .Build();
        }
    }
    

    可以通过assembly.GetManifestResourceNames()方法查看所有嵌入资源的完整名称,避免写错。

关键注意事项

  • 永远不要假设当前工作目录是类库的输出目录,主程序的工作目录可能被修改(比如控制台应用启动时指定了工作目录)。
  • 方案1适合需要允许用户修改配置的场景,方案2适合配置固定、不需要外部修改的场景。

内容的提问来源于stack exchange,提问作者Kiran

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 15:01:01