2013-04-29 12 views
5

Używam log4net do realizacji logowania w mojej aplikacji .NET. Jednak nie chcę rozpowszechniać log4net.dll 300kb dla każdego użytkownika, ale zamiast tego wysłać tę dll do użytkownika, jeśli ma problemy i chcę, aby zapewnić dzienniki.Jak ustawić log4net.dll jako opcjonalną?

Czy możliwe jest uruchomienie aplikacji bez względu na to, czy biblioteka DLL jest dostępna, czy nie? Oczywiście do zalogowania biblioteki dll będzie potrzebne, ale jeśli nie jest konieczne rejestrowanie, aplikacja powinna działać bez biblioteki dll.

+0

Zrób to plugin. Zobacz [MEF] (http://mef.codeplex.com/). – Oded

+2

300kb? To nic, wysyłaj to. –

+0

@SteveWellens Nic? Exe ma tylko 15kb i nie trzeba go instalować. –

Odpowiedz

4

Tak, jest to możliwe.

Najpierw utwórz interfase ze wszystkimi swoimi metodami dziennika:

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

Teraz utworzyć dwie instancje, obojętne instancja (pozwala wywołać DummyLogger), a instancja, która będzie wysyłać swoje wiadomości do log4net (Log4NetLogger).

do końca, utworzyć klasy fabrycznej:

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

Można sprawdzić, czy log4net dostępna jest po prostu sprawdzenie, czy plik jest w swojej bin-katalogu. Coś jak:

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

Ale mogę sobie wyobrazić, że chcesz robić inne kontrole, jak gdyby to istnieje w GAC lub cokolwiek.

Teraz można użyć do utworzenia fabryki rejestratora i „write” wiadomości w dzienniku:

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

Aby to zadziałało potrzebujesz aby dynamicznie wczytać bibliotekę log4net i skonstruować obiekt 'Log4NetLogger' poprzez odbicie. Jeśli nie, główna aplikacja będzie zawierała statyczne odniesienie do log4net.dll i odmówi rozpoczęcia, jeśli nie jest obecna. – MartinStettner

+0

@MartinStettner: Właśnie to przetestowałem. Moje rozwiązanie działa. Statyczne odniesienie zakończy się niepowodzeniem, gdy tylko wywołasz metodę, która będzie zawierała (nie koniecznie wymagane wywołanie/użycie) obiekty ze złożenia, którego nie ma. W moim przypadku odwołanie statyczne zakończy się niepowodzeniem, jeśli zostanie wywołany jeden z elementów Log4NetLogger, co nie nastąpi. –

+0

Jak skonfigurować rejestrowanie? – sgmoore

Powiązane problemy