2014-03-12 24 views
5

Gegeben eine Zeichenfolge, die eine bestimmte Klasse/Feld/Eigenschaft (zB MyNameSpace.MyClass oder System.String.Length) darstellt, wie kann ich Visual Studio programmgesteuert zu dieser Klasse/Feld/Eigenschaft wechseln (dh Visual Studio das gleiche tun, was passieren würde wenn ich die Referenz im Code-Editor eingeben und dann F12 drücken sollte)?Wie kann ich "Go To Definition" programmgesteuert in Visual Studio ausführen?

+1

F12/GotoDefn ist ein Standard devenv Befehl. Die Implementierung ist spezifisch für jedes Paket (C++, C#, VB.NET, F #, was auch immer). Die einzige Möglichkeit, dies zu simulieren, besteht darin, 1) einen Text, ein Snippet, irgendetwas, das die Editor-Schnittstelle verwendet, auszuwählen und 2) den Befehl "Edit.GoToDefinition" auszuführen: http://stackoverflow.com/questions/20168945/how-do- i-use-dte-executecommandedit-gotodefinition-in-a-vs2010-c-Makro –

+0

@SimonMourier Aber was ist, wenn es keinen Texteditor gibt, der den Text der Sache enthält, zu der ich gehen möchte? Gibt es eine Möglichkeit, eine unsichtbare Textansicht zu öffnen, die immer noch an dasselbe Projekt gebunden ist, aber keine Auswirkungen auf das Projektsystem oder irgendetwas anderes hat und auch im Debug-Modus funktioniert? –

+0

Im allgemeinen Fall scheint das schwierig. Möchten Sie ein bestimmtes Paket (C# -Dateien vielleicht?) Oder alle Pakete unterstützen? Wäre es ein Addin? eine Erweiterung? –

Antwort

7

Sie müssen wahrscheinlich Folgendes tun.

  1. Holen Sie sich das globale IVsObjectManager2 Interface (implementiert durch das SVsObjectManager Objekt)
  2. Anruf IVsObjectManager2.FindLibrary die C# Bibliothek zu bekommen, und warf das Ergebnis IVsSimpleLibrary2.
  3. Rufen Sie IVsSimpleLibrary2.GetList2 mit dem richtigen VSOBSEARCHCRITERIA2 an, um das Symbol in den Projekten für Ihre Lösung zu finden.

    1. Wenn die resultierende IVsSimpleObjectList2GetItemCount()==1 hat und mit CanGoToSourceVSOBJGOTOSRCTYPE.GS_DEFINITION kehrt pfOK==true, verwenden, um die GoToSource Methode, um die Quelle zu springen.

    2. Andernfalls zeigen Sie dem Benutzer einfach die möglichen Optionen an, anstatt zur Quelle zu springen. Sie können dafür die Schnittstelle IVsFindSymbol (implementiert durch das Objekt SVsObjectSearch) verwenden.

+1

Das funktioniert perfekt, danke! Wenn in Schritt 3.1 "GetItemCount() == 1" und "CanGoToSource" false zurückgibt, gibt es eine Möglichkeit, das Objektbrowserfenster für dieses Element als Alternative zu "GoToSource" zu öffnen? –

+0

@OmerRaviv Wie ist es möglich, dass mit der Anzahl der Parameter, die jeder dieser Aufrufe hat, und nicht ein einziges Stück Code, Sie dies richtig implementieren könnten? Ich muss das gleiche in VS2013 tun und ich bin total verloren. Können Sie bitte etwas Code zur Verfügung stellen? Vielen Dank. – JoanComasFdz

+3

@JoanComasFdz Ich habe meine Implementierung von diesem in einem Gist für Sie: https://gist.github.com/OmerRaviv/fc3ce6fbd5b6af501f01 Bitte beachten Sie, dass dieser Code nicht gut in VS2015 funktioniert, weil der neue Roslyn-Sprachdienst nicht 100% ist abwärtskompatibel. In VS2015 ist ein wesentlich zuverlässigerer und performanterer Ansatz, das ISymbol des Objekts zu finden, zu dem Sie wechseln möchten. Verwenden Sie dann die ISymbol.Locations-Eigenschaft, um den Quellspeicherort zu ermitteln. –