2010-02-25 12 views
23

seguito è come si dovrebbe ottenere la directory corrente dalla soluzione di un componente aggiuntivo:Come si ottiene la directory della soluzione corrente da un VSPackage?

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

come faresti questo tramite un VSPackage?

Sto migrando un componente aggiuntivo di Visual Studio in un VSPackage poiché intendo aggiungere alcuni controlli utente che richiedono una maggiore integrazione con l'IDE.

ho trovato alcune buone referenze sui meriti relativi di componenti aggiuntivi vs pacchetti di integrazione, quali: http://nayyeri.net/visual-studio-addin-vs-integration-package-part-1

e alcuni buoni tutorial su MSDN VSPackages quali: http://msdn.microsoft.com/en-us/library/cc138589.aspx

non ho trovato un buon riferimento ancora (su msdn o in altro modo) su come le interfacce di livello superiore in add-in (come DTE) mappano a interfacce di basso livello in VSPackages.

Qualsiasi buon riferimento là fuori per aiutare con la mappatura generale dalle interfacce del componente aggiuntivo alle interfacce VSPackage?

+0

2+ Domande e risposte sono rilevanti per i miei interessi. – Terrance

risposta

23

Ho trovato la risposta alla domanda specifica. L'oggetto VisualStudio.DTE possono essere recuperate tramite il metodo GetService() come segue:

// 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

Questo codice ha problemi quando sono in esecuzione più copie di Visual Studio? – Maslow

+0

Ho usato con più istanze di VS in modalità standard e in modalità ibernazione e non ho avuto problemi con l'ottenimento della soluzione corrente corretta. Approcci precedenti ho provato DID avere problemi nel trovare l'istanza corretta, come ad esempio: DTE dte = (DTE) System.Runtime.InteropServices.Marshal.GetActiveObject ("VisualStudio.DTE"); string solutionDir = System.IO.Path.GetDirectoryName (dte.Solution.FullName); –

7

è possibile ottenere un oggetto DTE da una di queste funzioni:

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); 
} 

Dopo di che, si può ottenere attivo Solution da DTE.Solution e Solution percorso da DTE.Solution.Path proprietà.

+1

Bel codice. Ora so come ottenerlo Oggetto DTE. Ma come ottengo un IServiceProvider (quando non si scrive un'estensione di Visual Studio). – Vaccano

Problemi correlati