QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

C# ソースファイル名やソースコード中の行数を取得することは可能か?

実行履歴をコンソール出力したいと思います。

いちいち、
Console.WriteLine("ソースファイル Class1.cs の 123 行目を通過しました");
などと書いていては、クラス名を変更したり、行数がずれたりして面倒です。
"Class1.cs"や"123"といった情報(つまりソースコード中の位置)を
コンパイル時に取得する方法はあるのでしょうか?

同様に
"クラス Class1 の メソッド Get を通過しました"
といったコンソール出力もできるのでしょうか?

質問者:ひろし

回答

スタック トレースについて調べてみてください。
ちなみにファイルなどの情報は、デバッグ情報がないと取得できませんよ。

_________________C# と VB.NET の入門サイト
じゃんぬねっと日誌

投稿者:じゃんぬねっと

編集 履歴 (0)


System.Diagnostics.Trace.WriteLine(
    System.Reflection.MethodInfo.GetCurrentMethod().DeclaringType.Name
    + "." + System.Reflection.MethodInfo.GetCurrentMethod().Name + " Called");

投稿者:burton999

編集 履歴 (0)

C#でもデバッグビルドであれば行番号やメソッド名を取得することは可能なはずです。ですがデバッグ情報を逐一参照したり、スタック情報をトレースして関数名を求めるためパフォーマンスに大きな悪影響を与えます。C++のように単純には行きません。

Loggingを行うなら自作するよりもLOG4J.NETを活用されるのが良いと思います。

投稿者:甕星

編集 履歴 (0)

アサート、というのもなかったかい?

投稿者:Jitta

編集 履歴 (0)

アサート、というのもなかったかい?

ありますよ。
System.Diagnostics.Trace.Assert()

_________________C# と VB.NET の入門サイト
じゃんぬねっと日誌

投稿者:じゃんぬねっと

編集 履歴 (0)

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

Reflectionをあまり使わなかったので、こういう時に使えると思い出せませんでした。

Traceクラスは知りませんでした。

LOG4で検索するとJava用のツールであるように説明されています。
C#(VS2003)に組み込んで使えるのでしょうか?
LOG4.NETをダウンロードおよび説明しているサイトを紹介願えればありがたいです。

投稿者:ひろし

編集 履歴 (0)

Log4.NET役立ちそうです。
感謝します。

投稿者:ひろし

編集 履歴 (0)

 すみません、中途半端になってますね。

Console.WriteLine("ソースファイル Class1.cs の 123 行目を通過しました");
ここで、行番号を出す意図がわかりませんでした。この後におっしゃっているように、ソースを修正すれば行番号はずれます。その為、行番号を出す意図がわかりませんでした。
 行番号を出すよりも、「××の処理が終了」などの方が、ログだけ見ても何をしているかがわかり、使いやすいと思います。

 Assert を紹介したのは、これが検査のためのものだからです。何かを検査して、意図しているものと違えばメッセージを出力します。あ、私は Debug.Assert を意図していたのですが、じゃんぬさんが紹介してくださった Trace.Assert だと、メッセージではなく、コールスタックがでる、ということは、行番号などもわかるのかな?さらに、構成ファイルで有効、無効を切り替えることが出来るからです。

 あと、他の人の質問も、目を通しておくと良いですよ。
→Webアプリの操作履歴をログファイルに残したい
 件名からは同じものだとわかり難いですが、実行しているメソッド名をログに吐いています。サンプルも提出してくださっています。『Web アプリ』となっていますが、ログ部は使えます。


投稿者:Jitta

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。