You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C#类库项目中获取log4net.config文件路径失败求助

解决C#类库项目中获取log4net.config路径的问题

首先得先排查一个关键前提:你的log4net.config文件有没有被正确复制到输出目录?在Visual Studio里右键这个文件,选择「属性」,把「复制到输出目录」设置为「如果较新则复制」或者「始终复制」——这一步没做的话,后面所有路径获取都是白搭,因为文件根本不在程序运行的目录里。

然后说下你之前代码里的问题:

  • 第二种方法里用了Path.Combine(dirPath, "\log4net.config"),这里第二个参数开头的反斜杠是致命错误!因为Path.Combine只要遇到以路径分隔符开头的参数,就会直接忽略前面的路径,返回这个参数本身,相当于你直接写了\log4net.config,这肯定不是你要的路径。

接下来给你几个可行的解决方案:

方案1:使用应用程序域基础目录(最推荐)

这个方法不管类库被哪个主程序调用(控制台、WinForm、Web等),都能获取到主程序的运行目录,只要你的log4net.config被复制到这个目录,就能找到:

using System;
using System.IO;

var configPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log4net.config");

方案2:从类库装配所在目录获取

如果你确定log4net.config和类库的DLL在同一个目录下,可以用这个方法,注意正确拼接路径(不要加多余的反斜杠):

using System.IO;
using System.Reflection;

var assemblyLocation = Assembly.GetExecutingAssembly().Location;
var assemblyDir = Path.GetDirectoryName(assemblyLocation);
var configPath = Path.Combine(assemblyDir, "log4net.config"); // 这里不要加开头的反斜杠!

验证路径是否正确

不管用哪种方法,都可以先输出路径看看实际指向哪里,方便排查:

Debug.WriteLine($"Config path: {configPath}");

然后去对应的目录看看log4net.config是不是真的在那里。

另外,如果你想更省心,也可以把log4net.config嵌入到类库的资源里,然后通过Assembly.GetExecutingAssembly().GetManifestResourceStream读取,但这种方式修改配置需要重新编译类库,不如复制到输出目录灵活。

内容的提问来源于stack exchange,提问作者yaghob abbasi

火山引擎 最新活动