Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从VSPackage中获取当前解决方案目录?_C#_Visual Studio_Solution_Vs Extensibility_Vspackage - Fatal编程技术网

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

C# 如何从VSPackage中获取当前解决方案目录?,c#,visual-studio,solution,vs-extensibility,vspackage,C#,Visual Studio,Solution,Vs Extensibility,Vspackage,以下是如何从外接程序获取当前解决方案目录: _applicationObject = (DTE2)application; // retrieved from OnConnection method string solutionDir = System.IO.Path.GetDirectoryName(_applicationObject.Solution.FullName); 您将如何通过VSPackage实现这一点 我正在将VisualStudio外接程序迁移到VSPackage,因为

以下是如何从外接程序获取当前解决方案目录:

_applicationObject = (DTE2)application;  // retrieved from OnConnection method
string solutionDir = System.IO.Path.GetDirectoryName(_applicationObject.Solution.FullName);
您将如何通过VSPackage实现这一点

我正在将VisualStudio外接程序迁移到VSPackage,因为我打算添加一些需要与IDE进行更深入集成的用户控件

我找到了一些关于外接程序与集成包的相对优点的很好的参考资料,例如:

以及一些关于VSN软件包上msdn的好教程,例如:

关于外接程序(如DTE)中的高级接口如何映射到VSE包中的低级接口,我还没有找到一个很好的参考(在msdn或其他方面)


有什么好的参考资料可以帮助我们从外接程序接口到VSPackage接口的一般映射吗?

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

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

您可以从以下函数之一获取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);
}

之后,您可以从
DTE.Solution
获取活动的
Solution
,从
DTE.Solution.path
属性获取
Solution
路径。

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

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

当visual studio的多个副本正在运行时,此代码是否有任何问题?我在标准和hibernate模式下使用过多个VS实例,在获取正确的当前解决方案时没有遇到任何问题。我尝试的早期方法在获取正确的实例时遇到了问题,例如:DTE DTE=(DTE)System.Runtime.InteropServices.Marshal.GetActiveObject(“VisualStudio.DTE”);字符串solutionDir=System.IO.Path.GetDirectoryName(dte.Solution.FullName);2+问题和答案与我的兴趣相关。代码不错。现在我知道如何获得DTE对象。但是如何获得iSeries Provider(在不编写Visual Studio扩展时)。