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?
Antwort
Sie müssen wahrscheinlich Folgendes tun.
- Holen Sie sich das globale
IVsObjectManager2
Interface (implementiert durch dasSVsObjectManager
Objekt) - Anruf
IVsObjectManager2.FindLibrary
die C# Bibliothek zu bekommen, und warf das ErgebnisIVsSimpleLibrary2
. Rufen Sie
IVsSimpleLibrary2.GetList2
mit dem richtigenVSOBSEARCHCRITERIA2
an, um das Symbol in den Projekten für Ihre Lösung zu finden.Wenn die resultierende
IVsSimpleObjectList2
GetItemCount()
==1
hat und mitCanGoToSource
VSOBJGOTOSRCTYPE.GS_DEFINITION
kehrtpfOK==true
, verwenden, um dieGoToSource
Methode, um die Quelle zu springen.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 ObjektSVsObjectSearch
) verwenden.
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? –
@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
@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. –
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 –
@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? –
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? –