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扩展时)。