30

Following is how you would get the current solution directory from an add-in:

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

How would you do this via a VSPackage?

I'm migrating a visual studio add-in to a VSPackage as I'm intending to add some user controls that require a deeper integration with the IDE.

I found some good references on the relative merits of add-ins vs integration packages such as: http://nayyeri.net/visual-studio-addin-vs-integration-package-part-1

And some good tutorials on msdn on VSPackages such as: http://msdn.microsoft.com/en-us/library/cc138589.aspx

I haven't found a good reference yet (on msdn or otherwise) on how the higher level interfaces in add-ins (such as DTE) map to lower level interfaces in VSPackages.

Any good references out there to help with general mapping from add-in interfaces to VSPackage interfaces?

Dave Clemmer
  • 3,741
  • 12
  • 49
  • 72

3 Answers3

30

I found the answer to the specific question. The VisualStudio.DTE object can be retrieved via the GetService() method as follows:

// 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);
Dave Clemmer
  • 3,741
  • 12
  • 49
  • 72
  • 2
    Does this code have any issues when multiple copies of visual studio are running? – Maslow Aug 24 '10 at 14:46
  • I have used with with multiple instances of VS in standard and hibernate mode and haven't run into any problems with getting the correct current solution. Earlier approaches I tried DID have trouble getting the correct instance, such as: DTE dte = (DTE)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE"); string solutionDir = System.IO.Path.GetDirectoryName(dte.Solution.FullName); – Dave Clemmer Aug 27 '10 at 16:40
10

You can get a DTE object from one of these functions:

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

After that, you can get active Solution from DTE.Solution and Solution path from DTE.Solution.Path property.

Medeni Baykal
  • 4,223
  • 1
  • 28
  • 36
  • 1
    Nice code. Now I know how to get he DTE Object. But how do I get an IServiceProvider (When not writing a Visual Studio extension). – Vaccano Jun 02 '12 at 17:38
2

If using the IVsSolution interface, you can use GetSolutionInfo to obtain the path of the solution, the solution filename, and the solution user options (SUO) filename:

this.solution.GetSolutionInfo(
    out string solutionDirectory,
    out string solutionFile,
    out string userOptsFile);
Bondolin
  • 2,793
  • 7
  • 34
  • 62