我可以在 Visual Studio "Clean Solution" 命令后直接将我的代码发送到 运行 吗?

Can I get my code to run directly after the Visual Studio "Clean Solution" command?

我正在创建我的第一个 Visual Studio 扩展,如果我可以在 Visual Studio“Clean Solution”命令完成执行后立即将我的代码设为 运行,那么一切都会很完美.

我找到了 EnvDTE._dispBuildEvents_Event.OnBuildDone,但似乎找不到它的堂兄 OnCleanDone

这样的事件真的存在吗?或者,我可以采取不同的方法吗?

谢谢各位大佬!

原来 Clean Solution 被认为是 BuildEvent,因此触发 EnvDTE._dispBuildEvents_Event.OnBuildDone

您需要做的就是检查参数 Action == vsBuildAction.vsBuildActionClean.

下面是我的完整解决方案(有两点注释):

  • 我收到警告“使用已弃用的 API 加载了一个或多个扩展”,因此我有一些工作要做,一旦我修复了它,我将更新此代码片段。也许命名约定和缺乏泛型应该表明我正在以一种过时的方式做这件事

  • 如果我不保持对 DTE.Events.BuildEvents 的有效引用,OnBuildDone 将不会触发。我还不知道为什么。

    public sealed class OnCleanSolutionDoneExtension : Package
    {
        protected override void Initialize()
        {
            base.Initialize();
    
            this.BuildEvents.OnBuildDone += OnBuildDone;
        }
    
        void OnBuildDone(vsBuildScope scope, vsBuildAction action)
        {
            if (action == vsBuildAction.vsBuildActionClean)
            {
                // 
            }
        }
    
        private BuildEvents BuildEvents
        {
            get
            {
                if (this.buildEvents == null)
                {
                    this.buildEvents = this.DevelopmentToolsEnvironment.Events.BuildEvents;
                }
    
                return this.buildEvents;
            }
        }
    
        private BuildEvents buildEvents;
    
        private DTE DevelopmentToolsEnvironment
        {
            get
            {
                return this.GetService(typeof(DTE)) as DTE;
            }
        }
    
        protected override void Dispose(bool disposing)
        {
            try
            {
                if (disposing)
                {
                    this.buildEvents.OnBuildDone -= OnBuildDone;
    
                    GC.SuppressFinalize(this);
                }
            }
            finally
            {
                base.Dispose(disposing);
            }
        }
    }