如何从VSPackage获取当前解决方案目录?

时间:2010-02-25 19:09:14

标签: c# visual-studio solution vs-extensibility vspackage

以下是如何从加载项获取当前解决方案目录:

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

您将如何通过VSPackage执行此操作?

我正在将Visual Studio插件迁移到VSPackage,因为我打算添加一些需要与IDE进行更深入集成的用户控件。

我发现了一些关于加载项与集成包的相对优点的一些很好的参考,例如: http://nayyeri.net/visual-studio-addin-vs-integration-package-part-1

在VSPackages上的msdn上有一些很好的教程,例如: http://msdn.microsoft.com/en-us/library/cc138589.aspx

我还没有找到关于加载项(例如DTE)中的更高级别接口如何映射到VSPackages中的较低级别接口的良好引用(在msdn或其他方面)。

有任何好的参考资料可以帮助实现从外接程接口到VSPackage接口的一般映射吗?

3 个答案:

答案 0 :(得分:27)

我找到了具体问题的答案。可以通过GetService()方法检索VisualStudio.DTE对象,如下所示:

// 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 :(得分:9)

您可以从以下功能之一获取DTE对象:

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

之后,您可以从Solution和[{1}}属性DTE.Solution路径获取有效Solution

答案 2 :(得分:1)

如果使用IVsSolution界面,则可以使用GetSolutionInfo获取解决方案的路径,解决方案文件名和解决方案用户选项(SUO)文件名:

this.solution.GetSolutionInfo(
    out string solutionDirectory,
    out string solutionFile,
    out string userOptsFile);