C#核心项目获取类旁配置文件相对路径(避免硬编码)
解决C#类库中获取同级配置文件路径(避免硬编码)的方案
针对你的项目结构(Awesome.Core类库的Selenium文件夹下有ZSelenium.cs和seleniumconfig.json,被多个其他项目引用),这里有几个实用方案,完全不用写那种容易出错的../../../硬编码路径:
方案1:基于程序集位置动态获取路径
这个方案适合需要让高级用户能找到并修改配置文件的场景,核心思路是通过类所在的程序集位置,拼接出配置文件的路径。
步骤:
- 右键
seleniumconfig.json→ 属性 → 设置复制到输出目录为「始终复制」或「如果较新则复制」。这样项目编译时,配置文件会跟着程序集一起输出到调用项目的bin目录下的Selenium文件夹里。 - 在
ZSelenium.cs中加入以下代码:
using System.IO; using System.Reflection; // 获取当前类所在程序集的路径 var assembly = typeof(ZSelenium).Assembly; var assemblyDir = Path.GetDirectoryName(assembly.Location); // 拼接配置文件的完整路径 var configFilePath = Path.Combine(assemblyDir, "Selenium", "seleniumconfig.json"); // 之后就可以用这个路径读取配置文件了,比如: var configContent = File.ReadAllText(configFilePath);
原理:
不管哪个项目引用了Awesome.Core,编译后ZSelenium.cs对应的程序集都会输出到调用项目的bin目录,而配置文件也会被复制到同目录的Selenium子文件夹下,所以通过程序集位置拼接的路径永远是正确的。
方案2:将配置文件嵌入程序集(适合不想暴露文件的场景)
如果希望配置文件被打包到程序集里,不单独存在(但仍允许高级用户通过反编译或替换程序集修改),可以用嵌入资源的方式:
步骤:
- 右键
seleniumconfig.json→ 属性 → 设置生成操作为「嵌入的资源」。 - 在
ZSelenium.cs中读取嵌入的资源:
using System.IO; using System.Reflection; using System.Text; var assembly = typeof(ZSelenium).Assembly; // 嵌入资源的名称格式:项目默认命名空间 + 文件夹名 + 文件名 // 比如你的项目默认命名空间是Awesome.Core,那资源名就是Awesome.Core.Selenium.seleniumconfig.json var resourceName = "Awesome.Core.Selenium.seleniumconfig.json"; using (var stream = assembly.GetManifestResourceStream(resourceName)) { if (stream == null) { throw new FileNotFoundException("未找到嵌入的配置文件,请检查资源名称是否正确"); } using (var reader = new StreamReader(stream, Encoding.UTF8)) { var configContent = reader.ReadToEnd(); // 解析配置内容,比如用System.Text.Json或Newtonsoft.Json } }
调试小技巧:
如果不确定嵌入资源的准确名称,可以用assembly.GetManifestResourceNames()获取所有嵌入资源的列表,找到对应的配置文件名称。
注意事项
- 方案1中一定要记得设置配置文件的复制属性,否则文件不会出现在调用项目的输出目录,会导致找不到文件。
- 若使用.NET Core/.NET 6+,
typeof(ZSelenium).Assembly比Assembly.GetExecutingAssembly()更可靠,能确保获取的是类库程序集,而不是调用项目的程序集。
内容的提问来源于stack exchange,提问作者scorpion35
相关产品推荐
相关产品推荐

