.NET Core 3.1类库被控制台引用时读取自身appsetting.json的方法
.NET Core 3.1类库读取自身appsettings.json的解决方案
问题根源
类库被项目引用后,运行时的当前工作目录是主控制台应用的bin目录,而非类库自身的输出目录,默认配置加载逻辑会从当前工作目录查找文件,因此找不到类库的appsettings.json。
解决方案
方案1:将类库的appsettings.json复制到主程序输出目录并定位加载
修改类库中appsettings.json的复制属性
- 在Visual Studio中右键类库的
appsettings.json→ 属性 → 高级 → 「复制到输出目录」选择「如果较新则复制」或「始终复制」。 - 或者手动编辑类库的
.csproj文件,添加以下配置:<ItemGroup> <None Update="appsettings.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> </ItemGroup>
这一步会确保类库的配置文件被同步复制到主控制台应用的bin目录中。
- 在Visual Studio中右键类库的
在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里:
设置appsettings.json为嵌入资源
- 在Visual Studio中右键类库的
appsettings.json→ 属性 → 「生成操作」选择「嵌入的资源」。 - 或编辑
.csproj:<ItemGroup> <EmbeddedResource Include="appsettings.json" /> </ItemGroup>
- 在Visual Studio中右键类库的
从嵌入资源中加载配置
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
相关产品推荐
相关产品推荐

