如何在Visual Studio 2022启动时自动运行扩展内的自定义命令?
VS2022扩展启动时自动执行自定义命令解决方案
你遇到的初始化方法仅在首次触发菜单项时调用,是VS扩展默认的按需加载机制导致的,只要强制扩展在VS启动阶段提前加载,再在对应时机调用命令逻辑即可,具体操作如下:
1. 强制扩展启动时自动加载
给你的扩展主Package类(继承自AsyncPackage的类)添加[ProvideAutoLoad]特性,指定触发加载的UI上下文:
[ProvideAutoLoad(VSConstants.UICONTEXT.ShellInitialized_string, PackageAutoLoadFlags.BackgroundLoad)] public sealed class YourExtensionPackage : AsyncPackage { // 你的Package原有代码 }
参数说明:
VSConstants.UICONTEXT.ShellInitialized_string表示VS核心外壳初始化完成时就触发扩展加载,适合不需要依赖解决方案的命令- 如果你的命令需要等解决方案加载完成后才运行,可以替换为
VSConstants.UICONTEXT.SolutionExistsAndFullyLoaded_string
2. 初始化完成后调用自定义命令
修改你Package类的InitializeAsync方法,在VS上下文就绪后直接调用你的命令逻辑即可,不需要依赖菜单项触发:
protected override async Task InitializeAsync(CancellationToken cancellationToken, IProgress<ServiceProgressData> progress) { await base.InitializeAsync(cancellationToken, progress); // 切换到VS主线程执行UI相关操作 await JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken); // 直接调用你命令的执行逻辑即可,此处替换为你的实际命令方法 YourCustomCommand.Instance.Execute(); }
注意事项
- 不要在
InitializeAsync中执行长时间的同步阻塞逻辑,会拖慢VS启动速度,甚至触发VS的扩展性能警告被用户禁用,耗时操作请放到后台线程异步执行 - 如果你的命令需要判断VS状态是否完全就绪,可以通过
SVsShell服务获取VSSPROPID_ShellInitialized属性确认状态后再执行逻辑
内容的提问来源于stack exchange,提问作者Sam Marrocco
相关产品推荐
相关产品推荐

