我是Visual Studio Extensibility Framework的新手,可以使用VSPackage Extension。我想在用户控件中获取一个DTE对象,该对象在MyToolWindow类中调用。
我尝试了以下所有可能性:
1。EnvDTE80.DTE2 dte2;
dte2 = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.10.0");
string solutionPath=dte2.Solution.FullName;
上述试验仅提供了打开的visual studio的第一个实例的SolutionPath。 对于EX:如果打开Math1.sln和Math2.sln,则只为MathPath分配Math1.sln路径。
一旦获得DTE对象,我将很容易获得当前实例的解决方案名称。
我必须能够在用户控件内部的按钮内获取适当的EnvDTE80.DTE对象。此用户控件在MyToolWindow.cs
中调用对此的任何帮助将不胜感激。
答案 0 :(得分:2)
首先,Marshal.GetActiveObject("VisualStudio.DTE.10.0")
是有问题的,因为它只会为您提供DTE
随机Visual Studio实例。您可以通过DTE
调用获取GetService
的正确实例。
然后只需枚举DTE.Solution.Properties
,其中一个属性应该是解决方案名称。可能是DTE.Solution.Properties.Item("Name")
,但我目前无法检查这一点。
对于“无法识别GetService”,方法是在IServiceProvider
实现的ToolWindowPane
上定义的。如果要在控件中使用它,则应将工具窗口实例传递给控件。例如:
public class MyToolWindow: ToolWindowPane {
void SomeMethod() {
var myControl = new MyControl(this);
}
}
public class MyControl: UserControl {
public MyControl(IServiceProvider serviceProvider) {
// Now you can call serviceProvider.GetService
}
}
答案 1 :(得分:0)
我有一个抽象的VsPackage类,我在所有自制的扩展中使用它;我以这种方式获得应用程序实例......
using EnvDTE80;
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Shell.Interop;
public abstract class VsPackage : Package
{
...
protected DTE2 GetApplication()
{
return this.GetService(typeof(SDTE)) as DTE2;
}
...
}