2011-09-11 7 views
2

私はメソッドのAssertを(書いた):私は、行と列の両方がトリガ0に等しいなければならないのはなぜ.NETたStackFrameと現在の行/列

[System.Diagnostics.Conditional("DEBUG")] 
internal static void Assert(bool condition) 
{ 
    if (!condition) 
    { 
     var message = 
       "Line:" + (new System.Diagnostics.StackFrame(1)).GetFileLineNumber() + "\r\n" + 
       "Column:" + (new System.Diagnostics.StackFrame(1)).GetFileColumnNumber() + "\r\n" + 
       "Where:" + (new System.Diagnostics.StackFrame(1)).GetMethod().Name; 
      Log("ASSERTION", message); 
     } 
    } 

?これは、Debug.Assert(false)が呼び出される場所であるはずです。

よろしく、あなたがStackFrame(int, bool)オーバーロードを使用し、2番目の引数としてtrueを指定する必要が

+0

なぜあなた自身のアサートメソッドを書いていますか? –

+0

自分のログシステムに書き込む必要があるためです。アセンブリはSQLCLRトリガーなので、出力は特殊なテーブルに格納されます。 – noober

+0

.pdbは.exe/.dllと同じフォルダにありますか?古いバージョンのモノを使用していますか? – Sklivvz

答えて

8

StackFrame(int)過負荷だけがソース情報をキャプチャしていないようです。

サンプルコード:

using System.Diagnostics; 

... 

[Conditional("DEBUG")] 
internal static void Assert(bool condition) 
{ 
    if (!condition) 
    { 
     StackFrame frame = new StackFrame(1, true); 
     var message = string.Format("Line: {0}\r\nColumn: {1}\r\nWhere:{2}", 
            frame.GetFileLineNumber(), 
            frame.GetFileColumnNumber(), 
            frame.GetMethod().Name); 
     Log("ASSERTION", message); 
    } 
} 

(ところで、あなたのコメントを見てみると、あなたデバッグ情報が格納されているところだPDBファイルが必要になりますそれは、この意志かどうかは全く明らかに私にはありません。 SQLCLRのトリガで正直に働きます。コンソールアプリケーションでは上記のことができますが、それは私が言うことだけです...)

+0

詳細な回答ありがとうございます! – noober

+0

Hm ... PDBが必要な場合、なぜrelease.configure()のNameはReleaseコンフィグレーションと最適化でも機能しますか? (私は以前それをチェックした)。ところで、行/列が0のとき、新しいStackFrame(1)でも動作します。 – noober

+1

@noober:メソッド名は、.NETアセンブリを構成する通常のメタデータの一部です。デバッグ情報ではありません。 –

関連する問題