2007年11月3日土曜日

[.NET]System.Diagnostics.StackTrace

今、以下のようなクラスを作っています。
  • ネームスペースの一部分をファイル名にしたXMLを読み込む
  • 指定キーよりXMLの要素を取り出す
  • ただし、呼び出し元から指定するのはキーのみ
そこで、メソッドの呼び出し履歴をさかのぼるために、System.Diagnostics.StackTraceを使ってみました。
とりあえずデバックモードでそれらしく動作したので、一安心していたのですが、ヘルプを見るとリリースモードでは呼び出しが最適化され、一部のコールスタックが最適化されることがある旨記載があっため念のためリリースモードで試してみると案の定コールスタックの出方が異なることがわかりました。

そこで、#ifで、デバッグモードとの切り替えを実施してみましたが、本来通過しているメソッドの履歴がなくなっており(この辺が最適化だと思います)ちょっと困っています。
いくつかのアセンブリに分かれるのとファイルの単位=アセンブリの単位であるのと、このクラスはこのクラスのみのアセンブリになるため、
  • コールスタックをさかのぼる方式は同じ
  • このクラスがあるアセンブリ以外のアセンブリまでさかのぼる
  • そのネームスペースのファイルを参照する
  • 指定キーよりXMLの要素を取り出す
  • 値を返却する
という方式をとってみようと思います。が、うまくいくだろうか。。。
最悪全部のアセンブリ用にサブクラスを作り、初期化ルーチンのみ実装する方針になりそうなんですが、何かいい方法は無いだろうか。。。

0 件のコメント: