2015-08-28 11 views
22

Dies ist die Funktion:Fehler, wenn ein bedingter Haltepunkt auf System.Type mit

public void Init(System.Type Type) { 
    this.Type = Type; 
    BuildFieldAttributes(); 
    BuildDataColumns(FieldAttributes); 
} 

ich einen Haltepunkt in der ersten Zeile festgelegt haben (this.Type = Type) und ich möchte brechen, wenn Type.FullName == "Malt.Organisation" so dass das, was ich als Bedingung eingetreten.

jedoch die folgende Fehlermeldung angezeigt wird, wenn die Leitung getroffen wird:

Die Bedingung für einen Breakpoint auszuführen fehlgeschlagen. Die Bedingung war 'Type.FullName == "Malt.Organisation"'. Der zurückgegebene Fehler war 'Überprüfen des Status eines Objekts im Debuggee vom Typ System.Type wird in diesem Kontext nicht unterstützt.'

Was (offensichtliche) Sache mache ich falsch?

PS. Eine Abhilfe ist dies den Code hinzuzufügen:

if (Type.FullName == "Malt.Organisation") System.Diagnostics.Debugger.Break(); 
+0

Möglicherweise nicht relevant, aber übergeben Sie einen ['RunTimeType' oder einen' Type'] (http://stackoverflow.com/q/5737840/1364007) in Ihre Methode? –

+1

Der Debugger ist ziemlich explizit: "Wir unterstützen das noch nicht". Auch in VS2015 sollte es dank Roslyn besser sein. Wenn es jemals eine Frage gibt, die Sie hier nicht beantworten können, müssen Sie Microsoft fragen. Sie sind nicht dazu geneigt, Versprechungen zu machen. –

+1

Ich rate Ihnen dringend davon ab, Typ als Variablennamen oder Eigenschaftsnamen zu verwenden. Dies führt unweigerlich zu Konflikten, weil Ihre Variable auch der Name eines bekannten Typs ist. Funktioniert es, wenn Sie Type in type und/oder theType umbenennen? –

Antwort

27

In meinem Fall habe ich Visual Studio 2013 NUnit 2.6.4 wurde mit und einen Debugger an einer Unit-Test-Sitzung Anbringen und ich war eine ähnliche Meldung erhalten:

Die Bedingung für einen Haltepunkt fehlgeschlagen ausführen. Die Bedingung war 'type.Name.Contains ("FooBar")'. Der zurückgegebene Fehler war 'Überprüfen des Status eines Objekts im Debuggee vom Typ System.Type wird in diesem Kontext nicht unterstützt.'. Klicken Sie auf OK, um an diesem Haltepunkt zu stoppen.

Dies wurde durch ein fehlendes Feature in der neuen Debugging-Engine verursacht, die Microsoft offenbar eingeführt hatte. Nach Anweisungen von this msdn blogpost habe ich Dinge zur Arbeit gebracht. Die Anweisungen laufen auf:

  1. Von der "Werkzeuge" Menü öffnen "Optionen"
  2. Auf der linken Seite Pick "Debugging", "Allgemeine"
  3. Scroll den ganzen Weg hinunter zu überprüfen "Verwenden verwalteter Kompatibilitätsmodus"

Dies sollte zu der Legacy-Debug-Engine wechseln, was in meinem Fall Ausdrücke für Typ in Break-Point-Bedingungen erlaubt. Beachten Sie, dass Sie die App oder die Debugsitzung natürlich neu starten müssen.

Haftungsausschluss: Ich habe keine Ahnung, welche anderen Effekte diese Option hatte. Persönlich habe ich es ausgeschaltet, als ich mit der Aufgabe fertig war, die es verlangte ...

+1

Das funktionierte auch für mich. Es war definitiv ein schwerer Performance-Hit mit meinem Breakpoint. Ich denke, Ihr Vorschlag, die Einstellung danach abzuschalten, ist klug. – yourbuddypal

+1

Hatte ein ähnliches Problem mit VS2015 Update 2: Ein Breakpoint mit der Bedingung 'pi.Name ==" whatever "' (wobei 'pi' vom Typ' System.Reflection.PropertyInfo' ist) öffnet einen Dialog 'Den Status einer Das Objekt im Debuggee des Typs System.Reflection.PropertyInfo wird in diesem Kontext nicht unterstützt. Das Erzwingen des verwalteten Kompatibilitätsmodus für den Debugger ermöglicht jetzt, dass der Haltepunkt wie erwartet getroffen wird. Wie lange wird es dauern, bis MS ihren "neuen" Debugger mit dem "alten" Feature vollständig ausstattet? –

+0

@MachineLearning Hey Kumpel, meine Antwort ist ziemlich alt und auf die gestellte Frage ausgerichtet. Wenn Sie eine neue Follow-up-Frage haben, schlage ich vor, eine [mcve] zu erstellen und eine neue Frage damit zu stellen, die diese Antwort möglicherweise als Referenz verknüpft. – Jeroen

4

Sie sagen, dass Type.FullName == "Malt.Organisation" bewirkt, dass es zu brechen, haben Sie this.Type.FullName == "Malt.Organisation" versucht?

Eine andere Möglichkeit, denkt der Debugger, dass Sie versuchen, eine statische Methode aufzurufen, bei der die Variable Type wie der Klassenname heißt? Ändert das Umbenennen der Type-Variablen zu etwas anderem es?

+0

Das hat funktioniert .. Vielen Dank @Daniel Store – DfrDkn

0

Ich bin mir nicht sicher über die hier beschriebene "Use Managed Compatibility Mode" Lösung - hat mir nicht geholfen, aber in meinem Fall Project > Properties > Debug > Enable Native code debugging - muss deaktiviert sein.

Warum - keine Ahnung derzeit.

Wurde mit .net 4.5, vs2015, Konsolenanwendung.

1

Ich lief dies aber beim Testen für IsInterface in einer Webanwendung. Anstatt zusätzliche Funktionen im Debugger zu aktivieren, habe ich einfach betrogen.

bool blnIsInterface = tType.IsInterface; 

//Insert breakpoint here... 
if(blnIsInterface) 
{ 
    ... 
} 

Also in Ihrem Fall könnte Ihr so ​​etwas wie

public void Init(System.Type Type) { 
    bool blnBreak = Type.FullName == "Malt.Organisation"; 
    //insert breakpoint of blnBreak == true 
    this.Type = Type; 
    BuildFieldAttributes(); 
    BuildDataColumns(FieldAttributes); 
} 

tun Es ist ein bisschen umständlich, aber zumindest werden Sie nicht um Leistung Treffer kümmern und ermöglicht Native Code-Debugging scheint nicht zu eine Option in Webanwendungen sein.