2013-04-29 24 views
5

Uso log4net per implementare la registrazione nella mia app .NET. Tuttavia non voglio distribuire il log4net.dll 300kb per ogni utente, ma invece inviare questa dll all'utente se ha problemi e voglio che fornisca i log.Come posso rendere log4net.dll facoltativo?

Quindi, è possibile far funzionare la mia app indipendentemente dalla presenza della dll? Ovviamente per la registrazione sarebbe necessaria la dll, ma se non è necessaria alcuna registrazione, l'app dovrebbe funzionare senza la DLL.

+0

Ne fanno un plugin. Vedi [MEF] (http://mef.codeplex.com/). – Oded

+2

300kb? Non è niente, spediscilo. –

+0

@SteveWellens Niente? L'exe ha solo 15kb e non ha bisogno di essere installato. –

risposta

4

Sì, è possibile.

innanzitutto creare un interfase con tutti i metodi di registro:

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

Creare ora due casi, un esempio fittizio (consente di chiamare DummyLogger), e un'istanza che invierà i suoi messaggi a Log4Net (Log4NetLogger).

Per finire, creare una classe di fabbrica:

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

Si potrebbe verificare se Log4Net è disponibile semplicemente controllando se il file è nel bidone-cartella. Qualcosa di simile:

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

Ma posso immaginare che si desidera fare altri controlli, come se esiste nel GAC o qualsiasi altra cosa.

Ora è possibile utilizzare il fabbrica per creare il tuo logger e "scrivere" i messaggi nel log:

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

Per far funzionare tutto questo è necessario caricare la libreria log4net in modo dinamico e costruire l'oggetto 'Log4NetLogger' tramite riflessione. In caso contrario, l'applicazione principale conterrà un riferimento statico a log4net.dll e si rifiuterà di avviarsi se non è presente. – MartinStettner

+0

@MartinStettner: l'ho appena testato. La mia soluzione funziona. Un riferimento statico non riuscirà non appena si chiama un metodo che conterrà (non necessario chiamare/utilizzare) oggetti dall'assieme mancante. Nel mio caso il riferimento statico fallirà se viene chiamato uno dei membri di Log4NetLogger, cosa che non accadrà. –

+0

Come si configura la registrazione? – sgmoore

Problemi correlati