1

私は約 1 年前に C# に変換した Visual C++.net プログラマー__FILE__です__LINE__。を置き換えるために__FILE__、class.method を返す素敵な関数を書きました。これは素晴らしいですが、適切な代替手段がありませ__LINE__ん (間違っていたら訂正してください!)。

言語の違い、技術的な制限、理由、その他すべてを理解しています。

私が求めているのはこれです:

いくつかのタイプのトークン (~~LINE~~ など) を定義できるようなビジュアル スタジオ拡張機能 (すべての開発者がインストールしたもの) を作成することは実用的ですか、それとも可能ですか?実行可能ファイルにコンパイルされたときに、テキストの置換または何かがそのシンボルを実際のVS行番号に切り替えますか?

拡張プログラミングに関する私の知識は最小限で、ext についてはわかりません。システムの制限。

明確にするために編集:

C++ では__FILE__、コンパイルされると、コードを記述した現在のファイルが返され、現在の__LINE__行が返されます。すべてのログ システム (10 年以上前のもの) はすべて、ファイルに char* を必要とし、ログを記録する行に int を必要とするため、これは重要です。

C# は、C++ のようにこれら 2 つの「トークン」を生成できません。

例として:

LoggingService.LogException(e, "file.cs", 1234);  

実行可能ファイルにコンパイルしたいものであり、

LoggingService.LogException(e, ~~MYFILE~~, ~~MYLINE~~); 

コードをどのように表示し、ディスクに保存したいかです。ファイルを取得するための適切な代替手段がありますが、行を取得するための代替手段がありません。

編集2:

これらのリリース ビルドは、デバッグ シンボルなしです。私たちの製品のインストールは、この修正に対応するために何百メガバイトも大きくする必要がありますが、これは問題外です.

4

4 に答える 4

3

発信者情報は .NET 4.5 で提供されます。これはコンパイルされ、スタックトレースを手動で調べるよりも大幅に改善されます:

http://msdn.microsoft.com/en-us/library/hh534540(v=vs.110).aspx

public void LogException(Exception ex,
        [CallerFilePath] string filePath = "",
        [CallerLineNumber] int lineNumber = 0)
{
    // Log it!
}

コンパイラの魔法のおかげで、これは次のように呼び出されます。

LoggingService.LogException(e);
于 2012-07-12T18:37:03.997 に答える
2

最初に C プリプロセッサを介してすべての C# コードを実行し、結果をコンパイルするだけです。そのためには、CS ファイルのビルド ルールを変更する必要があります。

于 2012-07-12T18:26:20.383 に答える
1

注: 例外を処理している場合、スタック フレームは例外内にあるため、これは必要ありません。これを一度使用して、ログシステムで行とファイルの情報を保存しましたが、それが私が考えることができる唯一のユースケースですが、「それほど高速ではありません」。

警告: リリース ビルドにシンボルがない場合、この情報の一部は利用できません。

using System;
using System.Diagnostics ;

StackTrace st=new StackTrace (0,true);

StackFrame sf=new StackFrame ();
sf=st.GetFrame (0);
Console.WriteLine ("FileName: {0}",sf.GetFileName ());
Console.WriteLine ("Line Number: {0}",sf.GetFileLineNumber ());
Console.WriteLine ("Function Name: {0}",sf.GetMethod ());

そこには列と型、その他のものもあります...詳細については、こちらをご覧ください。

http://msdn.microsoft.com/en-us/library/system.diagnostics.stackframe.aspx

于 2012-07-12T18:26:12.567 に答える
0

行は例外のスタック トレースにあります。しかし、それを抽出するのではなく、デバッグに役立つ他の情報があるため、スタックトレース全体をログに記録する必要があると思います(さらに、プリプロセッサステートメントのために、行番号が数行ずれている場合があります)

Web フォームまたは MVC で ASP.Net Web アプリケーションを実行している場合は、ELMAHを強くお勧めします。そのすべてのロギングを処理します

于 2012-07-12T18:31:40.440 に答える