2017-05-25 2 views
0

Ich habe eine Klasse mit einer Eigenschaft, und ich muss debuggind Auswertung abfangen.Wie Erkennung von IDE-Debugger zu erkennen

Und ich weiß nicht, wie ich das tun kann.

class Foo 
{ 
    public bool DebugIsAllow { get; set; } = false; 
    public string Value 
    { 
     get 
     { 
      if (!DebugIsAllow && IsDebugging()) throw new Exception(); 
      return "ok"; 
     } 
    } 
    public bool IsDebugging() 
    { 
     return ????? 
    } 

    public void Main() 
    { 
     var v = Value; 
Breakpoint here !!! 
     DebugIsAllow = true; 
Breakpoint here !!! 
    } 
} 

Beim ersten Haltepunkt, wenn ich Spion für 'v' und 'Value' hinzufügen, möchte ich in Ãœberwachungsfenster sehen: v = "ok" und Value = "Exception"

Und in zweiter Ich möchte im Watch-Fenster sehen: v = "ok" und Value = "ok"

Vielen Dank für Ihre Hilfe.


Edit:

ich mit "System.Diagnostics.Debugger.IsAttached" versuchen, aber aber Debugger ist immer angebracht. Nicht nur wenn die IDE-Klasseneigenschaft durch das Überwachungsfenster angezeigt wird.

+0

Wir wissen nicht, warum Sie das tun müssen. Ziehen Sie in Erwägung, einen Obfuscator zu verwenden, um das Leben von jemandem zu erschweren. –

+1

Verwenden Sie ggf. das Attribut "[DebuggerDisplay]" (https://msdn.microsoft.com/de-de/library/x810d419.aspx), um zu ändern, was in Visual Studio-Toolfenstern gerendert wird. Es ist jedoch nicht konzipiert für die Verschleierung verwendet werden, und es kann sowieso leicht herum gearbeitet werden. –

+0

Es ist nicht für Obfuscator. In Wirklichkeit ist diese Eigenschaft mit einem Cache-System und einem Fernaufrufsystem verbunden. Und ich möchte nicht, dass der Debugger den Remote-Aufruf auslöst. Aber ich möchte erlauben, dass es Wert im Cache bekommt. Das Attribut [System.Diagnostics.DebuggerBrowsable] kann die Auswertung vollständig deaktivieren. Aber in diesem Fall kann ich leicht Wert im Cache bekommen ... –

Antwort

-1

können Sie dieses Compiler-Direktive der Annahme verwenden, dass die DEBUG Konstante definiert ist:

public bool IsDebugging() 
{ 
#if DEBUG 
    return true; 
#else 
    return false; 
#endif 
} 
+0

Nein, es wird nicht funktionieren. "DEBUG" Constante wird nur sagen, ob es als Debug oder Release kompiliert wurde. Nicht, wenn es normale Ausführung oder IDE-Debug-Aufruf ist ... –

0

Verwenden Sie das Attribut [DebuggerDisplay] ein benutzerdefiniertes Anzeigeschema für die Verwendung in dem Debugger zu implementieren. Zum Beispiel verwendet die Klasse Lazy<T> dies, um das Debuggen zu stoppen, was zu einer verzögerten Auswertung führt.

https://msdn.microsoft.com/en-us/library/x810d419.aspx