Frage

Ich habe eine Methode Assert () geschrieben:

[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);
        }
    }

Warum müssen Zeile und Spalte beim Auslösen gleich 0 sein?Es soll der Ort sein, an dem Debug.Assert (false) aufgerufen wird.

Grüße,

War es hilfreich?

Lösung

Sie müssen die Überladung StackFrame(int, bool) verwenden und true als angebenzweites Argument.Es sieht so aus, als würde nur die StackFrame(int)-Überladung keine Quellinformationen erfassen.

Beispielcode:

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);
    }
}

(Wenn Sie sich Ihre Kommentare ansehen, benötigen Sie übrigens die PDB-Dateien. Dort werden die Debug-Informationen gespeichert. Mir ist überhaupt nicht klar, ob dies in einem SQLCLR-Trigger funktioniert.um ehrlich zu sein. Das Obige funktioniert für mich in einer Konsolen-App, aber das ist alles, was ich sagen kann ...)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top