我使用log4net在我的.NET應用程序中實現日誌記錄。 但是我不想爲每個用戶分發300kb的log4net.dll,而是發送這個DLL給用戶,如果他有問題,我希望他提供日誌。如何讓log4net.dll成爲可選項?
那麼,是否有可能使我的應用程序運行,無論該DLL是否在那裏? 當然,需要記錄dll,但如果不需要日誌記錄,應用程序應該運行沒有dll。
我使用log4net在我的.NET應用程序中實現日誌記錄。 但是我不想爲每個用戶分發300kb的log4net.dll,而是發送這個DLL給用戶,如果他有問題,我希望他提供日誌。如何讓log4net.dll成爲可選項?
那麼,是否有可能使我的應用程序運行,無論該DLL是否在那裏? 當然,需要記錄dll,但如果不需要日誌記錄,應用程序應該運行沒有dll。
是的,這是可能的。
首先用您的所有日誌方法的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!");
爲了這個工作,你需要動態加載log4net庫並通過反射構建Log4NetLogger對象。否則,主應用程序將包含對log4net.dll的靜態引用,如果不存在則拒絕啓動。 – MartinStettner 2013-04-29 12:20:16
@MartinStettner:我剛測試過它。我的解決方案確實有效只要您調用一個方法,該方法將包含(不必調用/使用)缺少的程序集對象,則靜態引用將失敗。在我的情況下,如果調用Log4NetLogger的成員之一,則靜態引用將失敗,這不會發生。 – 2013-04-29 12:54:06
你如何配置你的日誌? – sgmoore 2013-04-29 19:03:21
使它成爲一個插件。參見[MEF](http://mef.codeplex.com/)。 – Oded 2013-04-29 12:10:17
300kb?沒什麼,運送它。 – 2013-04-29 12:14:32
@SteveWellens什麼都沒有?該exe只有15kb,並不需要安裝。 – 2013-04-29 12:44:08