在VSpackage的ToolWindow中获取解决方案名称

时间:2013-01-08 09:09:46

标签: c# .net visual-studio envdte vspackage

我是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路径。

  1. MSDN链接中,无法在button1.click中识别“this.GetService”(我在这里遗漏了任何内容)
  2. 一旦获得DTE对象,我将很容易获得当前实例的解决方案名称。

    我必须能够在用户控件内部的按钮内获取适当的EnvDTE80.DTE对象。此用户控件在MyToolWindow.cs

    中调用

    对此的任何帮助将不胜感激。

2 个答案:

答案 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; 
    }

    ...
}