.NET Standard 2.0类库如何在Web及命令行应用中定位同目录XML资源
可行方案
方案1:通过CodeBase属性准确定位同目录XML文件
该方案不受IIS shadow copy机制影响,适配所有类型的宿主应用:
using System.Reflection; using System.IO; // 核心定位逻辑 var currentAssembly = Assembly.GetExecutingAssembly(); UriBuilder uriBuilder = new UriBuilder(currentAssembly.CodeBase); string assemblyRawPath = Uri.UnescapeDataString(uriBuilder.Path); string dllDirectory = Path.GetDirectoryName(assemblyRawPath); // 替换为你的XML文件名 string targetXmlPath = Path.Combine(dllDirectory, "your_config.xml");
原理说明:
Assembly.CodeBase返回的是程序集原始部署位置的URL,不会被shadow copy机制影响,转换成本地路径后就能直接拿到类库DLL所在的bin目录,和你设置的「Content+始终复制」的部署规则完全匹配。
方案2:路径交由上层宿主应用传入(更灵活的规避方案)
如果需要支持管理员自定义配置文件存放位置,可以选择该方案:
- 类库对外提供路径配置入口,可通过静态属性、构造函数参数、初始化方法参数等方式暴露
- 由引用类库的Web/WinForm/控制台应用根据自身的技术栈,传入配置文件的完整路径
- 类库内部仅做路径合法性、文件存在性校验即可,无需处理跨类型应用的路径适配逻辑
- 管理员可根据部署需求,将XML文件放在任意有权限的目录,不需要强制和类库DLL同目录
原有方案失效原因
Assembly.GetExecutingAssembly().Location:IIS默认开启shadow copy,会将加载的程序集复制到临时目录运行,该属性返回的是临时目录路径,不是原始部署路径Environment.GetCurrentDirectory():返回的是宿主进程的工作目录,不同类型应用的默认工作目录差异极大,不固定System.Web.Hosting.HostingEnvironment.MapPath是ASP.NET Framework专属API,.NET Standard类库无法直接引用,也不兼容非Web类应用
内容的提问来源于stack exchange,提问作者user256890
相关产品推荐
相关产品推荐

