2013-04-29 3 views
5

私は.NETアプリケーションでログを実装するためにlog4netを使用します。 しかし、私はすべてのユーザーに対して300kbのlog4net.dllを配布するのではなく、問題がある場合にこのdllをユーザーに送信し、ログを提供したいと思っています。log4net.dllをオプションにするにはどうすればよいですか?

だから、DLLがあるかどうかにかかわらず、私のアプリを動かすことは可能ですか? もちろん、dllをロギングするためには必要ですが、ロギングが必要ない場合は、dllなしでアプリケーションを実行する必要があります。

+0

がプラグインしてください:

は、今すぐあなたのロガーを作成し、ログにメッセージを「書く」ためにあなたの工場を使用することができます。 [MEF](http://mef.codeplex.com/)を参照してください。 – Oded

+2

300kb?それは何もない、それを運ぶ。 –

+0

@SteveWellens何もない? exeファイルはわずか15kbで、インストールする必要はありません。 –

答えて

4

はい、可能です。

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

今すぐ2つのインスタンスを作成し、ダミーのインスタンスは(DummyLoggerそれを呼び出すことができます)、およびlog4netの(Log4NetLogger)にそのメッセージを送信する場合:

まず、すべてのログ・メソッドとinterfaseを作成します。

終了するには、ファクトリクラスを作成します。

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

log4netのは、ファイルがあなたのビンのフォルダにある場合、単純にチェックすることで利用可能かどうかをチェックできます。何かが好き:

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

しかし、あなたがGACなどに存在するかのように、他のチェックをしたいと思うかもしれません。

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

これを動作させるには、 log4netライブラリを動的にロードし、リフレクションを介して 'Log4NetLogger'オブジェクトを構築します。そうでない場合、メインアプリケーションはlog4net.dllへの静的な参照を含み、存在しなければ開始を拒否します。 – MartinStettner

+0

@MartinStettner:私はそれをテストしました。私の解決策は機能します。不足しているアセンブリから(必要でない呼び出し/使用ではない)オブジェクトを含むメソッドを呼び出すとすぐに、静的参照が失敗します。私の場合、Log4NetLoggerのメンバーの1人が呼び出された場合、静的な参照は失敗しますが、これは起こりません。 –

+0

ロギングをどのように設定しますか? – sgmoore

関連する問題