2011-09-11 25 views
2

我寫了一個方法,斷言():.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); 
     } 
    } 

爲什麼我有兩行和列等於0,觸發時?它應該是調用Debug.Assert(false)的地方。

問候,

+0

你爲什麼要編寫自己的斷言方法? –

+0

因爲我必須寫入我自己的日誌系統。由於程序集是SQLCLR觸發器,因此輸出存儲在特殊表中。 – noober

+0

是否將.pdb放在與.exe/.dll相同的文件夾中?你使用的是舊版本的單聲道嗎? – Sklivvz

回答

8

您需要使用StackFrame(int, bool)過載,並指定true作爲第二個參數。它看起來像只是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

嗯......如果我需要PDB,爲什麼frame.GetMethod()。Name即使在Release配置和優化上也能工作? (我之前檢查過)。順便說一句,它也適用於新的StackFrame(1),當行/列爲0. – noober

+1

@noober:方法名稱是構成.NET程序集的常規元數據的一部分 - 它不是調試信息。 –