2011-09-11 30 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程序集的常规元数据的一部分 - 它不是调试信息。 –