2013-04-29 23 views
5

我使用log4net在我的.NET應用程序中實現日誌記錄。 但是我不想爲每個用戶分發300kb的log4net.dll,而是發送這個DLL給用戶,如果他有問題,我希望他提供日誌。如何讓log4net.dll成爲可選項?

那麼,是否有可能使我的應用程序運行,無論該DLL是否在那裏? 當然,需要記錄dll,但如果不需要日誌記錄,應用程序應該運行沒有dll。

+0

使它成爲一個插件。參見[MEF](http://mef.codeplex.com/)。 – Oded 2013-04-29 12:10:17

+2

300kb?沒什麼,運送它。 – 2013-04-29 12:14:32

+0

@SteveWellens什麼都沒有?該exe只有15kb,並不需要安裝。 – 2013-04-29 12:44:08

回答

4

是的,這是可能的。

首先用您的所有日誌方法的interfase:

public interface ILogger 
{ 
    void Write(string message); 
    // And much more methods. 
} 

現在創建兩個實例,一個虛擬實例(可以稱之爲DummyLogger),以及一個實例,它會發送其消息log4net的(Log4NetLogger)。

要結束,創建一個工廠類:

static public class LogFactory 
{ 
    static public ILogger CreateLogger() 
    { 
      if (/*Check if Log4Net is available*/) 
       return new Log4NetLogger(); 
      else 
       return new DummyLogger(); 
    } 
} 

您可以檢查是否log4net的是可通過簡單的檢查,如果該文件是在你的bin文件夾。就像:

File.Exists(AppDomain.CurrentDomain.BaseDirectory + "Log4Net.dll") 

但我可以想象,你想要做其他檢查,就像它存在於GAC或其他什麼。

現在你可以使用你的工廠來創建你的記錄器和「寫」消息日誌:

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

爲了這個工作,你需要動態加載log4net庫並通過反射構建Log4NetLogger對象。否則,主應用程序將包含對log4net.dll的靜態引用,如果不存在則拒絕啓動。 – MartinStettner 2013-04-29 12:20:16

+0

@MartinStettner:我剛測試過它。我的解決方案確實有效只要您調用一個方法,該方法將包含(不必調用/使用)缺少的程序集對象,則靜態引用將失敗。在我的情況下,如果調用Log4NetLogger的成員之一,則靜態引用將失敗,這不會發生。 – 2013-04-29 12:54:06

+0

你如何配置你的日誌? – sgmoore 2013-04-29 19:03:21

相關問題