0

我是 Visual Studio 可扩展性框架的新手,可以使用 VSPackage 扩展。我想在 MyToolWindow 类中调用的用户控件中获取 DTE 对象。

我尝试了以下所有可能性:

1.EnvDTE80.DTE2 dte2; dte2 = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.10.0"); string solutionPath=dte2.Solution.FullName;

上面的试验只给出了打开的视觉工作室的第一个实例的解决方案路径。对于 EX:如果打开 Math1.sln 和 Math2.sln,则只有 Math1.sln 路径分配给 solutionPath。

  1. MSDN链接中,无法在 button1.click 中识别“this.GetService”(我在这里遗漏了什么)

一旦获得 DTE 对象,我就可以很容易地获得当前实例的解决方案名称。

我必须能够在单击用户控件内的按钮内获得适当的 EnvDTE80.DTE 对象。此用户控件在 MyToolWindow.cs 中调用

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

4

2 回答 2

3

首先,这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
    }
}
于 2013-01-08T09:35:29.277 回答
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; 
    }

    ...
}
于 2013-01-14T10:50:30.520 回答