【问题标题】:Can I get my code to run directly after the Visual Studio "Clean Solution" command?我可以让我的代码在 Visual Studio“清洁解决方案”命令之后直接运行吗?
【发布时间】:2020-11-21 21:07:46
【问题描述】:

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

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

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

谢谢各位大佬!

【问题讨论】:

  • 您可以使用 EnvDTE.CommandEvents 监控“清洁解决方案”命令执行:stackoverflow.com/a/33939128/84507
  • 感谢您的想法!但是,我没有让它工作,这完全是我的错,但在这个过程中,我发现OnBuildDone 实际上会触发 Clean Solution 命令,并且参数enum vsBuildAction 包含值vsBuildActionClean正是我想要的!
  • @JoepGeevers,既然你有一个解决方法,我建议你可以在这里添加一个答案而不是评论。
  • @PerryQian-MSFT 谢谢你提醒我,我刚刚做了

标签: c# visual-studio-extensions vsix envdte


【解决方案1】:

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

你需要做的就是检查参数Action == vsBuildAction.vsBuildActionClean是否。

我的完整解决方案如下(附两句):

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

  • 如果我不保持对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);
            }
        }
    }
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多