如何从被引用的DLL中获取ASPNET Core Web应用的根目录位置
实现方案
完全可以实现,不需要在类库中额外引用ASP.NET Core相关包,以下是两种常用的可靠方案:
方案1:依赖注入传递路径(最推荐)
这是最解耦、兼容性最强的实现方式,完全保留.NET Standard类库的跨框架特性:
- 首先在.NET Standard类库中定义路径配置类和业务服务,路径从构造函数传入即可
// 类库中定义的路径配置类 public class AppPathConfig { public string ContentRootPath { get; } public AppPathConfig(string contentRootPath) { ContentRootPath = contentRootPath ?? throw new ArgumentNullException(nameof(contentRootPath)); } } // 类库中需要用到根路径的业务服务 public class LibraryService { private readonly string _contentRootPath; public LibraryService(AppPathConfig pathConfig) { _contentRootPath = pathConfig.ContentRootPath; } public void ExecTask() { // 直接使用根路径拼接目标文件/目录地址 var targetPath = Path.Combine(_contentRootPath, "custom-files", "config.json"); } } - 然后在ASP.NET Core 3.1 Web应用的Startup类中完成注入即可
public class Startup { public IWebHostEnvironment HostEnvironment { get; } public Startup(IConfiguration configuration, IWebHostEnvironment hostEnvironment) { Configuration = configuration; // 注入Web主机环境实例 HostEnvironment = hostEnvironment; } public void ConfigureServices(IServiceCollection services) { // 注册路径配置实例,直接传入Web应用的根路径 services.AddSingleton(new AppPathConfig(HostEnvironment.ContentRootPath)); // 注册类库的业务服务 services.AddScoped<LibraryService>(); // 原有其他服务注册逻辑 } }
方案2:类库内部直接获取(仅适合特殊场景)
如果你的场景不适合用依赖注入,也可以通过应用域属性直接获取,仅需要注意本地调试阶段的路径适配问题:
// 类库中直接实现路径获取方法 public static class PathHelper { public static string GetWebContentRootPath() { // 发布后AppContext.BaseDirectory默认就是Web应用的ContentRootPath var rootPath = AppContext.BaseDirectory; // 本地Debug阶段路径会落到bin目录,向上回退找根目录标识文件即可 #if DEBUG while (rootPath != null && !File.Exists(Path.Combine(rootPath, "appsettings.json"))) { rootPath = Directory.GetParent(rootPath)?.FullName; } #endif return rootPath; } }
注意:如果你的Web项目删除了默认的appsettings.json文件,需要把判断条件换成你项目中确定存在于根目录的文件名。
注意事项
不要为了调用ContentRootPath在类库中引用Microsoft.AspNetCore.App元包,会导致类库失去.NET Standard的跨框架优势,兼容性大幅下降。
内容的提问来源于stack exchange,提问作者sonupmandal
相关产品推荐
相关产品推荐

