10

次を使用して、実行時に複数のアセンブリをロードするシングルスレッドアプリケーションがあります。

objDLL = Assembly.LoadFrom(strDLLs[i]);

この方法で読み込まれたアセンブリが、残りのアセンブリと同じ log4net.ILog 参照​​を使用することを望みます。しかし、ランタイムにロードされたアセンブリにはまったく異なる参照があり、独自の構成が必要なようです。単一の log4net.ILog を、.NET インターフェイスを使用して実行時にロードされたアセンブリ全体で使用できるかどうかを知っている人はいますか?

Program クラスの log4net.ILog 作成およびサポート コードは次のとおりです。

   // Configure log4net using the .config file
   [assembly: log4net.Config.XmlConfigurator(Watch = true)]

   public static class Program
   {
      private static log4net.ILog m_Log = null;

      [STAThread]
      public static void Main(string[] args)
      {
         try
         {
            m_Log = log4net.LogManager.GetLogger(
               MethodBase.GetCurrentMethod().DeclaringType);
         }

      }
   }
4

5 に答える 5

2

すべてのアセンブリが共通のインターフェイスを実装している場合は、動的にロードされたアセンブリにILogのローカルインスタンスを渡すことができるプロパティまたはコンストラクターパラメーターを使用できます。

于 2008-09-25T21:33:36.287 に答える
2

リテラルロガー名文字列を指定することで同じロガーを取得でき、同じロガーインスタンスを取得できます。

log4net.LogManager.GetLogger("SomeLogger");
于 2008-10-09T01:44:24.027 に答える
2

この回答は4年遅れていますが、同じ問題に遭遇しました。私の場合、(呼び出し元のアセンブリとは別のフォルダーから) 読み込まれていたアセンブリが、log4net の独自のインスタンスも読み込んでいることがわかりました。

ランタイム アセンブリが読み込まれていたフォルダーから log4net.dll ファイルを削除することで、この問題を修正しました。

于 2012-10-16T15:43:15.480 に答える
0

ランタイムロードされたクラスに関する何かが、クラスごとに通常の1つのILogが機能するのを妨げています。有効なILogインスタンスを取得できますが、他のすべてのインスタンスとは異なり、構成されていないように見えます(すべてのIs ** Enabledフラグがfalseに設定されています)。おそらく、「ルート」ロガーは、実行時にロードされたクラスにアクセスできませんか?

于 2008-09-25T21:43:20.973 に答える
0

私は愚かな解決策を持っています。XmlConfiguration をメインの log4net 構成ファイルに設定できます。

[assembly: log4net.Config.XmlConfigurator(ConfigFile="<configpath>",Watch = true)]

それは本当に美しさではありません..しかし、それは実行されます。

于 2008-10-22T15:17:10.420 に答える