You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VS2022中VSIX工具窗口按钮点击事件如何访问EnvDTE?

在VS2022的VSIX工具窗口中实现按钮点击事件访问DTE

步骤1:让工具窗口持有Package实例引用

修改自动生成的ToolWindow1类(继承自ToolWindowPane),调整构造函数以接收AsyncPackage参数并保存为私有字段:

using Microsoft.VisualStudio.Shell;
using System;

[Guid("替换为你的工具窗口GUID")]
public class ToolWindow1 : ToolWindowPane
{
    private readonly AsyncPackage _package;

    public ToolWindow1(AsyncPackage package) : base(null)
    {
        _package = package ?? throw new ArgumentNullException(nameof(package));
        Caption = "ToolWindow1";

        // 加载工具窗口的用户控件
        Content = new ToolWindow1Control();
    }
}

步骤2:关联按钮点击事件并获取DTE实例

根据按钮所在位置,选择以下两种方式之一处理:

方式一:在ToolWindowPane中订阅按钮事件

在ToolWindow1构造函数中获取用户控件实例,直接订阅按钮点击事件,通过Package获取DTE:

public ToolWindow1(AsyncPackage package) : base(null)
{
    _package = package ?? throw new ArgumentNullException(nameof(package));
    Caption = "ToolWindow1";

    Content = new ToolWindow1Control();
    var control = Content as ToolWindow1Control;
    
    // 订阅按钮点击事件
    control.btnTest.Click += async (sender, e) =>
    {
        // 异步获取DTE服务
        var dte = await _package.GetServiceAsync(typeof(EnvDTE.DTE)) as EnvDTE.DTE;
        
        if (dte != null)
        {
            // 示例:获取当前活动文档名称
            var activeDoc = dte.ActiveDocument;
            MessageBox.Show($"当前活动文档:{activeDoc?.Name ?? "无"}");
        }
    };
}

方式二:将Package引用传递给UserControl

修改ToolWindow1Control的构造函数,接收AsyncPackage参数,在控件内部处理点击事件:

  1. 编辑ToolWindow1Control.xaml.cs:
using Microsoft.VisualStudio.Shell;
using System.Windows;

public partial class ToolWindow1Control : UserControl
{
    private readonly AsyncPackage _package;

    public ToolWindow1Control(AsyncPackage package)
    {
        _package = package;
        InitializeComponent();
    }

    private async void btnTest_Click(object sender, RoutedEventArgs e)
    {
        var dte = await _package.GetServiceAsync(typeof(EnvDTE.DTE)) as EnvDTE.DTE;
        if (dte != null)
        {
            // 执行DTE相关操作,比如获取解决方案路径
            var solutionPath = dte.Solution.FullName;
            MessageBox.Show($"解决方案路径:{solutionPath}");
        }
    }
}
  1. 在ToolWindow1构造函数中传递Package:
public ToolWindow1(AsyncPackage package) : base(null)
{
    _package = package ?? throw new ArgumentNullException(nameof(package));
    Caption = "ToolWindow1";

    // 将Package传递给用户控件
    Content = new ToolWindow1Control(package);
}

步骤3:确保引用EnvDTE程序集

如果项目未自动引用EnvDTE,手动添加:

  • 右键项目 → 添加 → 引用 → COM → 勾选「Microsoft Development Environment 8.0」(VS2022兼容此版本)
  • 或通过NuGet安装Microsoft.VisualStudio.SDK.EnvDTE包(更推荐的方式)

注意事项

  • 优先使用GetServiceAsync而非同步GetService,符合VS2022异步扩展最佳实践,避免阻塞UI线程
  • 操作DTE时需确保在UI线程执行,VS的DTE对象仅支持UI线程访问

内容的提问来源于stack exchange,提问作者user3461121

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 14:43:23