首页 > 解决方案 > 我可以让我的代码在 Visual Studio“清洁解决方案”命令之后直接运行吗?

问题描述

我正在创建我的第一个 Visual Studio 扩展,如果我可以在 Visual Studio“清洁解决方案”命令完成执行后立即运行我的代码,那么一切都会很完美。

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

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

谢谢各位大侠!

标签: c#visual-studio-extensionsvsixenvdte

解决方案


结果Clean Solution被认为是 a BuildEvent,因此会触发EnvDTE._dispBuildEvents_Event.OnBuildDone

您需要做的就是检查 if parameter Action == vsBuildAction.vsBuildActionClean

下面是我的完整解决方案(有两个评论):

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

  • 如果我不保持对 的主动引用DTE.Events.BuildEventsOnBuildDone则不会触发。我还不知道为什么。

    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);
            }
        }
    }
    

推荐阅读