.net StackFrame и текущая строка / столбец - PullRequest
2 голосов
/ 12 сентября 2011

Я написал метод Assert ():

[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).

С уважением,

1 Ответ

8 голосов
/ 12 сентября 2011

Вам нужно использовать перегрузку 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, чтобы Если честно, вышесказанное работает для меня в консольном приложении, но это все, что я могу сказать ...)

...