如何在被引用的.NET Core类库中获取ASPNET Core Web应用根目录
解决方案
可以在类库内部直接获取到ASP.NET Core 3.1 Web应用的根目录,无需从Web侧传参或使用依赖注入,具体实现如下:
实现思路
你需要的目录是ASP.NET Core的ContentRoot目录,也就是appsettings.json等配置文件所在的目录,兼容开发环境和生产发布环境的逻辑如下:
- 开发环境:从程序运行目录向上遍历,找到包含
appsettings.json的Web项目根目录 - 发布环境:直接使用.NET运行时提供的应用基目录,该目录默认就是发布后的ContentRoot路径
代码实现
无需修改Web应用的任何代码,只需修改类库的ProcessRootFolder方法即可:
using System; using System.IO; using System.Linq; namespace Library { public class Class1 { public static void ProcessRootFolder() { string contentRootPath = null; // 开发环境适配:向上遍历查找Web项目根目录 var currentDir = AppContext.BaseDirectory; while (!string.IsNullOrEmpty(currentDir)) { // 匹配当前目录是否存在appsettings.json,同时存在.csproj文件 if (File.Exists(Path.Combine(currentDir, "appsettings.json")) && Directory.EnumerateFiles(currentDir, "*.csproj", SearchOption.TopDirectoryOnly).Any()) { contentRootPath = currentDir; break; } currentDir = Directory.GetParent(currentDir)?.FullName; } // 生产环境直接使用应用基目录 contentRootPath ??= AppContext.BaseDirectory; // 此处编写处理根目录文件的逻辑,contentRootPath就是目标路径 // 示例:输出路径验证 Console.WriteLine($"Web应用根目录路径:{contentRootPath}"); } } }
注意事项
- 如果你的解决方案里存在多个带
appsettings.json的项目,可以增加对csproj文件内容的判断,匹配<Project Sdk="Microsoft.NET.Sdk.Web">的就是Web项目根目录,进一步提升准确率。 - 单文件发布场景下,
AppContext.BaseDirectory依然指向解压后的运行目录,和配置文件存放路径一致,无需额外适配。
内容的提问来源于stack exchange,提问作者sonupmandal
相关产品推荐
相关产品推荐

