C# 如何使log4net.dll成为可选的?

C# 如何使log4net.dll成为可选的?,c#,log4net,C#,Log4net,我使用log4net在我的.NET应用程序中实现日志记录。 但是,我不想为每个用户分发300kb log4net.dll,而是在用户有问题并且我希望他提供日志时将此dll发送给用户 那么,无论dll是否存在,是否有可能让我的应用程序运行? 当然,记录dll是需要的,但是如果不需要记录,应用程序应该在没有dll的情况下运行。是的,这是可能的 首先使用所有日志方法创建一个interbase: public interface ILogger { void Write(string messa

我使用log4net在我的.NET应用程序中实现日志记录。 但是,我不想为每个用户分发300kb log4net.dll,而是在用户有问题并且我希望他提供日志时将此dll发送给用户

那么,无论dll是否存在,是否有可能让我的应用程序运行? 当然,记录dll是需要的,但是如果不需要记录,应用程序应该在没有dll的情况下运行。

是的,这是可能的

首先使用所有日志方法创建一个interbase:

public interface ILogger
{
    void Write(string message);
    // And much more methods.
}
现在创建两个实例,一个是虚拟实例(我们称之为
DummyLogger
),另一个是将其消息发送到Log4Net的实例(
Log4NetLogger

要完成,请创建一个factory类:

static public class LogFactory
{
     static public ILogger CreateLogger()
     {
          if (/*Check if Log4Net is available*/)
               return new Log4NetLogger();
          else
               return new DummyLogger();
     }
}
您可以通过简单地检查文件是否在您的bin文件夹中来检查Log4Net是否可用。比如:

File.Exists(AppDomain.CurrentDomain.BaseDirectory + "Log4Net.dll")
但我可以想象你想要做其他的检查,比如GAC中是否有

现在,您可以使用工厂创建日志记录器并将消息“写入”日志:

ILogger logger = LoggerFactory.CreateLogger();
logger.Write("I am logging something!");

让它成为一个插件。看,300kb?没什么,把它运出去。@SteveWellens没什么?exe只有15kb,不需要安装。要使其工作,您需要动态加载log4net库,并通过反射构造
Log4NetLogger
对象。如果没有,主应用程序将包含对log4net.dll的静态引用,如果不存在,则拒绝启动。@MartinStettner:我刚刚测试过它。我的解决方案确实有效。只要调用将包含程序集中缺少的对象(无需调用/使用)的方法,静态引用就会失败。在我的例子中,如果调用Log4NetLogger的一个成员,静态引用将失败,这不会发生。如何配置日志记录?好问题。我可以想象Log4Net需要提前配置。如果将设置放在app.config中,则app.config将取决于将产生异常的可用组件。幸运的是,Log4Net支持一个单独的XML文件,该文件可以与exe一起交付。当Log4Net.dll复制到应用程序文件夹中时,Log4NetLogger可以加载并使用该配置文件。这如何使Log4Net.dll成为可选的?应用程序现在耦合到log4net.dll,并且它必须存在于系统上,应用程序才能运行(需要能够找到
Log4NetLogger
class)。