How do you get the current solution directory from a VSPackage?
-
22-09-2019 - |
Question
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?
Solution
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);
OTHER TIPS
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.
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);