DOBON.NET DOBON.NETプログラミング掲示板過去ログ

TraceSourceに自作のリスナを指定したい(構成ファイルから)

環境/言語:[WindowsXP、C#、.NET Framework 3.5]
分類:[.NET]

はじめまして。

現在、TraceSourceのリスナに自作のリスナを追加したいと考えており、

1.クラスライブラリ(MyLib.dll、名前空間:MyLib)内に
  TextWriterTraceListenerクラスから派生したMyTextWriterTraceListenerを作成しました。

2.アプリケーション(MyApp.exe)と同じフォルダにMyLib.dllを置いて、
  アプリケーションにはMyLib.dllへ参照を追加しました。

3.アプリケーション構成ファイル(MyApp.exe.config)に以下のように記述しました。

  <configuration>
   <system.diagnostics>
    <sources>
     <source name="MySource"
      <listeners>
       <add name="MyListener" type="MyLib.MyTextWriterTraceListener"/>
      </listeners>
     </source>
    </sources>
   </system.diagnostics>
  </configuration>

この状態でアプリケーションから以下のコードを実行したところ、

  TraceSource appTrace = new TraceSource("MySource");
  appTrace.TraceEvent(TraceEventType.Warning, 0, "警告");

2行目(TraceEventのある行)でConfigurationErrorsExceptionが発生し、
「クラス MyLib.MyTextWriterTraceListener の型が見つかりませんでした。」
と表示されてしまいました。

自作のリスナをアプリケーション構成ファイルからTraceSourceに追加したい場合、
どのように記述すればよいでしょうか?
> 自作のリスナをアプリケーション構成ファイルからTraceSourceに追加したい場合、
> どのように記述すればよいでしょうか?

  私はやったことないので、回答ではありません・・・

  http://dobon.net/vb/dotnet/programing/tracelisteners.html#listener

  これ見ましたか?

以上。
回答ありがとうございます。

>   http://dobon.net/vb/dotnet/programing/tracelisteners.html#listener
>
>   これ見ましたか?

はい。

 http://dobon.net/vb/dotnet/programing/tracesource.html

も同様に参考にさせて頂きました。

どちらも既に用意されているリスナを追加する方法であり、
自作のリスナを追加するといった例は載っていませんでした。

また、実行時に自作のリスナを追加すれば例外が発生せず、
期待通りの動作をするのですが、構成ファイルから追加すると
最初に書いた通り、ConfigurationErrorsExceptionの例外が発生します。

<add>要素のtypeの指定に誤りがあるのかもしれないので、
もう少し調べてみたいと思います。
> <add name="MyListener" type="MyLib.MyTextWriterTraceListener"/>
これだとどのアセンブリの MyLib.MyTextWriterTraceListener なのか分からないから、.exe と mscorlib.dll しか見ないでしょう。
アセンブリ名やカルチャも含めた完全限定名を指定しないといけないかと。
typeof(xxx).AssemblyQualifiedName で確認できます。
>><add name="MyListener" type="MyLib.MyTextWriterTraceListener"/>
> これだとどのアセンブリの MyLib.MyTextWriterTraceListener なのか分からないから、.exe と mscorlib.dll しか見ないでしょう。
> アセンブリ名やカルチャも含めた完全限定名を指定しないといけないかと。
> typeof(xxx).AssemblyQualifiedName で確認できます。
>

なるほど…。
AssemblyQualifiedName()の結果が、

 MyLib.MyTextWriterTraceListener, MyLib,
 Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

となったので、アプリケーション構成ファイルの記述を、

 <add name="MyListener" type="MyLib.MyTextWriterTraceListener"/>
                ↓
 <add name="MyListener" type="MyLib.MyTextWriterTraceListener,
                MyLib,
                Version=1.0.0.0,
                Culture=neutral,
                PublicKeyToken=null"/>

と変更することで、動作するようになりました。

また、

 <add name="MyListener" type="MyLib.MyTextWriterTraceListener"/>
                ↓
 <add name="MyListener" type="MyLib.MyTextWriterTraceListener,
                MyLib"/>

の場合も動作したので、リスナが存在するアセンブリの名前が指定されて
いればうまく探してくれるのかな。

オショウさん、Hongliangさん、ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板