2010-02-25 13 views
23

Es folgt, wie Sie die aktuelle Lösung Verzeichnis aus einem Add-in erhalten würde:Wie erhalten Sie das aktuelle Lösungsverzeichnis von einem VSPackage?

_applicationObject = (DTE2)application; // retrieved from OnConnection method 
string solutionDir = System.IO.Path.GetDirectoryName(_applicationObject.Solution.FullName); 

Wie würden Sie tun dies über eine VSPackage?

Ich migriere ein Visual Studio-Add-In zu einem VSPackage, da ich beabsichtige, einige Benutzersteuerelemente hinzuzufügen, die eine tiefere Integration mit der IDE erfordern.

fand ich einige gute Referenzen auf die relativen Vorteile von Add-Ins vs Integrationspakete wie: http://nayyeri.net/visual-studio-addin-vs-integration-package-part-1

und einige gute Tutorials auf Msdn auf VSPackages wie: http://msdn.microsoft.com/en-us/library/cc138589.aspx

Ich habe nicht fand eine gute Referenz (auf msdn oder anders), wie die Interfaces höherer Ebenen in Add-Ins (wie DTE) auf Interfaces niedrigerer Ebenen in VSPackages abgebildet werden.

Gibt es irgendwelche guten Referenzen, die bei der allgemeinen Zuordnung von Add-In-Schnittstellen zu VSPackage-Schnittstellen helfen?

+0

2+ Frage und Antwort sind relevant für meine Interessen. – Terrance

Antwort

23

Ich fand die Antwort auf die spezifische Frage. Das VisualStudio.DTE Objekt kann über das GetService() Methode abgerufen werden, wie folgt:

// Get an instance of the currently running Visual Studio IDE 
DTE dte = (DTE)GetService(typeof(DTE)); 
string solutionDir = System.IO.Path.GetDirectoryName(dte.Solution.FullName); 
+1

Hat dieser Code irgendwelche Probleme, wenn mehrere Kopien von Visual Studio ausgeführt werden? – Maslow

+0

Ich habe mit mehreren Instanzen von VS im Standard- und Ruhezustand Modus verwendet und habe keine Probleme mit der richtigen aktuellen Lösung bekommen. Frühere Ansätze, die ich versucht habe DID Probleme beim Abrufen der richtigen Instanz, wie zum Beispiel: DTE dte = (DTE) System.Runtime.InteropServices.Marshal.GetActiveObject ("VisualStudio.DTE"); String solutionDir = System.IO.Path.GetDirectoryName (dte.Solution.FullName); –

7

Sie können aus einer dieser Funktionen ein DTE-Objekt erhalten:

public static DTE GetCurrentDTE(IServiceProvider provider) 
{ 
    /*ENVDTE. */DTE vs = (DTE)provider.GetService(typeof(DTE)); 
     if (vs == null) throw new InvalidOperationException("DTE not found."); 
    return vs; 
} 

public static DTE GetCurrentDTE() 
{ 
    return GetCurrentDTE(/* Microsoft.VisualStudio.Shell. */ServiceProvider.GlobalProvider); 
} 

Danach können Sie aktiv Solution erhalten aus DTE.Solution und Solution Pfad von DTE.Solution.Path Eigentum.

+1

Netter Code. Jetzt weiß ich, wie man das DTE-Objekt bekommt. Aber wie bekomme ich einen IServiceProvider (wenn ich keine Visual Studio-Erweiterung schreibe). – Vaccano