C# TraceListernerの派生クラスを作る

      2017/05/24

プログラムを作ってデバッグをするときに「トレース」はとてもよく使います。
Visual Studioなどでは「出力」ウィンドウなどに表示などをしてくれるのでとても助かります。

デバッグの時などでも、ときどきこういった情報を扱いやすくなるようにする機能があるので試してみます。

.NETには TraceListerner というオブジェクトが用意されています。TraceListernerとは、トレース出力を受け取って、それを他の場所に出力するオブジェクトです。
TraceListerner は、アプリケーションからのトレース情報を出力ストアに送り出すためのパイプのようなもので、トレース情報をトレースリスナに書き込むと、そのトレースリスナがトレース情報をターゲットメディアに出力してくれます。

 

TraceListernerの派生クラスを作る

まず TraceListerner の派生クラスを作成します。
派生クラスは、単純に受け取ったトレース情報をテキストファイルに出力するだけのものにします。
このクラスは「クラスライブラリ(DLL)」として作成します。

TraceListernerクラスは、”System.Diagnostics.TraceListener”なので、”using System.Diagnostics;”を用意します。
クラスのメンバに文字列を保持するための”StringCollection”クラスを使うので、”using System.Collections.Specialized;”も必要です。

TraceListernerクラスの派生クラスに必要なメソッド

 

こちらは、今回の派生クラス固有の実装です。
private void OutputFile()・・・ファイルに出力するためのメソッド
private void Output(string message)・・・トレース情報を保持するためのメソッド

 

これらの実装を行ってクラスは、下記のようになります。

 

TraceListernerの派生クラスを使うテストプログラム

TraceListernerの派生クラスを呼び出すためにSystem.DiagnosticsのTraceやDebugで出力を行います。

サンプルプログラムのコードは下記のようになります。

 

今回のポイント

今回のサンプルプログラムで重要になるのは、このソースコードより”App.config”というプログラムのconfigファイルのほうです。
通常のWindowsフォームアプリケーションのApp.configは、このようなものです。

 

ここに

 

と、

 

を追加して、下記のようなXMLファイルとなるようにします。

 

 

<appSettings>部分は、トレース情報を出力するファイル名を指定するもので、今回の派生クラス固有の実装のための設定です。

<add key=”TraceFileName” value=”MyTrace.txt” />

のvalueに指定している”MyTrace.txt”が、出力されるファイル名です。

 

<system.diagnostics>部分は、今回の派生クラスを呼び出して動作するようにするための設定です。

<add name=”DBGTRACE” type=”TraceListenerDLL.Listener,TraceListenerDLL”/>

この行にあるtypeの値部分は、今回作成したクラスライブラリのクラス名と名前空間です。

 

このテストプログラムをビルドして実行するときには、TraceListernerの派生クラスのあるクラスライブラリをテストプログラムの実行ファイルがあるフォルダに置いてから実行します。

 

実行結果

実行すると、Visual Studioの[出力]ウィンドウに、今までと同じような実装されたDebugの出力が下記のように出ます。

frmMain_Load
btnExit_Click
frmMain_FormClosed

また、テストプログラムの実行ファイルがあるフォルダに”MyTrace.txt”というファイルが出力されています。
この”MyTrace.txt”の中身は下記のようになりました。

frmMain_Load
btnExit_Click
frmMain_FormClosed

今回作成したDLLは、このDLLのためのプログラムを用意しなくても他のプログラムの実行ファイルと同じフォルダにDLLを置いてApp.config(実行環境の場合”<プログラム名>.exe.config”)に上記の設定を追加するだけでも使用できます。
(プロジェクト設定で「DEBUG定数の定義」や「TRACE定数の定義」にチェックが入っていないと機能しないので、ご注意ください)

 

 - 未分類