2013-08-27 10 views
47

Ich arbeite seit einiger Zeit an einem Debugger-Visualizer für Visual Studio, und während der eigentliche Visualizer einwandfrei funktioniert. Das Problem ist, dass es sich immer an die Spitze der Visualizer-Liste stellt, wenn es eine Variable untersucht, die wirklich einige der Benutzer verärgert, die eher Text als den ersten haben (da der obere Standard auch beim Öffnen von VS ist).So geben Sie die Reihenfolge der Debugger-Visualizer in Visual Studio an

enter image description here

ich keine Unterstützung für diese auf DialogDebuggerVisualizer oder DebuggerVisualizerAttribute, die so meine ersten Gedanken waren finden kann ich für Informationen SO/MSDN/Google Scheuern habe, wie die Sortierreihenfolge der Visualizer beeinflussen (vorzugsweise, um meinen letzten in der Liste zu setzen), aber ohne Erfolg.

Unten ist, wie ich meinen Visualizer registriere, es zeigt dann nur ein Formular basierend auf dem Wert, der visualisiert wird.

using Microsoft.VisualStudio.DebuggerVisualizers; 

[assembly: System.Diagnostics.DebuggerVisualizer(
    typeof(Shorthand.VSAddins.JsonVisualizer.JsonVisualizer), 
    typeof(VisualizerObjectSource), 
    Target = typeof(string), 
    Description = "Json Visualizer")] 
namespace Shorthand.VSAddins.JsonVisualizer 
{ 
    public class JsonVisualizer : DialogDebuggerVisualizer 
    { 
     protected override void Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider) 
     { 
      var json = objectProvider.GetObject() as string; 

      var form = new VisualizerForm { Json = json }; 
      windowService.ShowDialog(form); 
     } 
    } 
} 

Weiß jemand, ob es möglich ist, die Reihenfolge der Visualizer zu beeinflussen oder soll ich es einfach sein lassen?

+0

Ich konnte nichts offensichtliches sehen, aber ich fand eine [DebuggerDisplayAttribute] (http://msdn.microsoft.com/en-us/library/system.diagnostics.debuggerdisplayattribute.aspx), die einige Hilfe bieten kann .. – Sayse

+1

Das 'DebuggerDisplayAttribute' wird verwendet, um anzupassen, wie eine Klasse im Debugger angezeigt wird, und hat leider nichts mit meinem Problem zu tun. Sehen Sie den Abschnitt "Bemerkungen" in dem Link, den Sie gepostet haben, für ein Beispiel dessen, was er tut. –

+1

Ah Entschuldigung, ich würde nur dann raten, dass sie nach der Reihenfolge sortiert sind, in der sie geladen sind. Ich persönlich würde sagen, lass es einfach sein ...Es gab ein IsDefaultAttribute – Sayse

Antwort

0

Es wird immer zuerst angezeigt, von Entwurf. Die Besetzung unter der Haube hat die beste Übereinstimmung für die Variable gefunden, über die sie nachdenkt.

können Sie jedoch zwei Dinge tun. Sie könnten den Visualizer nur dann erscheinen lassen, wenn der Sting ':' enthält. Oder Sie können reflection verwenden, um die Visualizer neu anzuordnen, indem Sie sie am Ende der Sammlung in der gewünschten Reihenfolge hinzufügen und die Originale aus der Sammlung entfernen. Für letztere müssen Sie wahrscheinlich die Sammlung von readonly zu beschreibbaren ändern. Über Reflexion.

Es gibt keine verlässliche Quelle, auf die Sie zurückgreifen können, außer Ihrem Willen zum Erfolg.

+0

Ich bin ziemlich sicher, dass die "unter der Haube Besetzung" gerade sah "Hey, es ist eine Zeichenfolge, lassen Sie alle Visualisierer mit' Target = typeOf (string) '". Haben Sie ein Beispiel dafür, wie es je nach dem Inhalt der Variablen angezeigt/verborgen wird? Es sei denn Sie meinen, dass die Option immer da sein wird, aber das Formular wird nicht angezeigt? –

+0

Ich stimme zu und ich bot die Lösung in meinem Beitrag an. Die Suche nach dem ':' als Teil dieser Zeichenfolge ist der Schlüssel –

0

Ich denke, dass VS 'unter der Haube' zwischen String-Typ und Typ von XML sehr leicht unterscheiden kann, aber Xml ist auch nur eine Zeichenfolge, so eine Schlüsselfrage wäre, wie sagt VS den Unterschied zwischen den zwei?

Könnten Sie sezieren die VS XML Visualizer, um zu sehen, wie es funktioniert (auch wenn Sie Reflektor auf der DLL zu verwenden, es zu tun haben, könnten Sie bekommen die Methode, um zu sehen, dass er nicht mehr funktioniert)

+0

Das Problem damit ist, dass der XML-Visualizer, soweit ich weiß, nicht in einer verwalteten Sprache geschrieben ist. Es zeigt auch den XML-Visualisierer für jede Art von String und zeigt auch den Dialog, so dass sie nichts tun, um den Inhalt des Strings zu unterscheiden. Das Erstellen einer speziellen JsonString-Klasse würde meinen Visualizer für die meisten Leute ziemlich nutzlos machen, da sie ihre Codebasis nicht ändern wollen, um sie zu benutzen, und die String-Klasse ist sowieso versiegelt, so dass sie nicht erweitert werden kann. Das ist auch ziemlich weit von meiner ursprünglichen Frage entfernt. –

+0

Auch ich habe die Antwort darauf gesucht und gesucht. und es gibt keine Informationen da draußen. Wenn Sie wie der XML-Visualizer einen nicht verwalteten Code verwenden, gibt es keine Möglichkeit, den Code korrekt wiederzugeben. Ich schätze, Ihre Benutzer werden damit leben müssen. Es ist keine große Sache, ich meine, sie entscheiden sich dafür, den Visualizer richtig zu benutzen. – FlemGrem

+0

können Sie 'jsonString: string' nicht ausführen. System.String ist versiegelt –

2

I don‘ Ich denke, es gibt eine Lösung. Aber es gibt einen Workaround:

Definieren Sie Ihren eigenen Text Visualizer und setzen Sie das entsprechende DebuggerVisualizer Attribut vor dem Attribut Ihrer JsonVisualizer. Das Ergebnis wird sein, dass die Zeichenfolge standardmäßig lesbar ist und Json Visualizer ausgewählt werden kann. Ein Fenster mit einer mehrzeiligen Textbox ist nicht zu viel Arbeit.

Es ist wahrscheinlich nicht einmal notwendig, Visualizer zu schreiben. Es sollte möglich sein, einen internen zu verwenden, aber ich kenne seinen Namen nicht (Which class is used for "Text Visualizer"?).

+1

True, aber ich bin mir nicht sicher, ob meine Benutzer es mögen würden, wenn mein Addon einen zusätzlichen Visualizer wie diesen einfügt. Einige würden es vielleicht akzeptieren, aber viele würden einfach sagen, dass es die Schnittstelle überfüllt, indem es eine Kopie des Standard-Interface einfügt. Aber die generelle Idee ist nett, ich könnte sie als Option hinzufügen. –