2011-02-04 19 views
2

I私は思っていたの.txtファイルコード実行時に現在の行番号を取得する方法はありますか? C#

Helper.WriteSimpleDebugTrace(securityLogFilePath, "About to authenticate user."); 
Helper.WriteSimpleDebugTrace(securityLogFilePath, "Directory Search Path:"); 
Helper.WriteSimpleDebugTrace(securityLogFilePath, "Username:" + username); 

にログを書き込み、アプリケーションが、私はこの方法に現在の行番号を渡すことができます方法がありますか?

+1

Environment.StackTraceはあなたの全体stacetraceを与えるだろう。たぶんそれを解析する。これは高価な操作であるため、これに本当に注意する必要があります。 pdbsなしでコードを公開すると、本番環境では動作しません。 ETA:http://peterkellner.net/2009/12/21/how-to-get-a-stack-trace-from-c-without-throwing-exception/には、特定のフレームの行番号を取得する例があります。なぜあなたはdidntの答えとしてこれを追加 - – Sean

+1

スコットHanselman氏は、まさにこの – Cameron

+0

ショーンについての短い[ブログ記事](http://www.hanselman.com/blog/GettingTheLineNumberAndFileNameFromC.aspx)を書きましたか?私はそれを答えとしてマークすることはできません:-)情報のおかげで。 – Exitos

答えて

3

StackFrame classこの情報を生成することができます。ページの最後に例を見てください。

+0

StackFrame.GetFileLineNumber –

2

おそらく、以下のような方法が必要です。 Conditional属性は、このメソッドへのすべての呼び出しを非デバッグリリースでは何もコンパイルしません。その後、0ではなくStackFrame 1を取得すると、DebugPrintTraceの呼び出しがどこで行われたかに関する情報が得られます。あなたのWriteSimpleDebugTraceへ

[Conditional("DEBUG")] 
    public static void DebugPrintTrace(string message) 
    { 
     StackTrace stackTrace = new StackTrace(true); 
     StackFrame sf = stackTrace.GetFrame(1); 
     Console.WriteLine("Trace " 
      + sf.GetMethod().Name + " " 
      + sf.GetFileName() + ":" 
      + sf.GetFileLineNumber() + Enviroment.NewLine); 

     Console.WriteLine(message + Enviroment.NewLine); 


    } 

いっそのこともcondtitional "DEBUG" を追加

+3

彼はロギングを望んでいます...条件付きでは使用しません。 string.Format –

+0

私たちがパフォーマンスを上げるには、stringbuilderがさらに優れています。ロギングでは、条件を任意のシンボルに変更できます。例えば、シンボルを定義する場合はCREATE_LOG、オプションを入れることができますアプリケーション内で、またはコマンドラインでコード行を変更することなく、ロギングをアクティブまたは非アクティブにする – Sorcerer86pt

+0

Nope! StringBuilderはパフォーマンスを改善しません: '' Trace "+ sf.GetMethod()。+" sf.GetFileName()+ ":" + sf.GetFileLineNumber()+ Enviroment.NewLine'は、 'string.Concat()'への単一の呼び出し(C#5.0 in Nutshell、p.206)。 –

関連する問題