如何拦截visual studio 2017 sdk中的项目保存事件?

时间:2017-09-16 02:27:58

标签: visual-studio-2017 visual-studio-extensions visual-studio-sdk

可以拦截visual studio 2017 sdk中的项目保存事件吗?

更新

我目前正在开发2017年视觉工作室的扩展程序,我需要知道何时发生任何变更。

例如:当我在项目中添加新引用时(我知道有添加/更改/删除引用但不符合我需要的事件),项目被标记为待处理以保存。我需要在保存时拦截它(如果在保存之前更好)。

我尝试了Dte.Events.DocumentEvents.DocumentSaved事件,但未在保存项目中触发; DTE.Events.SolutionEventsDTE.Events.SolutionItemEvents没有我需要的类型的事件。

有可能吗?

2 个答案:

答案 0 :(得分:2)

在这种情况下,正确的方法是使用实​​现IVsRunningDocTableEvents3覆盖OnBeforeSave方法。

通过这种方式,我确切地知道什么时候要保存项目并执行它所需要的。

例:

uint cookie;
var runningDocumentTable = (IVsRunningDocumentTable)GetGlobalService(typeof(SVsRunningDocumentTable));

runningDocumentTable.AdviseRunningDocTableEvents(new RunningDocTableEventsHandler(), out cookie);
using Microsoft.VisualStudio;
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Shell.Interop;

namespace YourProject
{
    internal class RunningDocTableEventsHandler : IVsRunningDocTableEvents3
    {

        #region Methods

        public int OnAfterFirstDocumentLock(uint docCookie, uint dwRDTLockType, uint dwReadLocksRemaining, uint dwEditLocksRemaining)
        {
            return VSConstants.S_OK;
        }

        public int OnBeforeLastDocumentUnlock(uint docCookie, uint dwRDTLockType, uint dwReadLocksRemaining, uint dwEditLocksRemaining)
        {
            return VSConstants.S_OK;
        }

        public int OnAfterSave(uint docCookie)
        {
            return VSConstants.S_OK;
        }

        public int OnAfterAttributeChange(uint docCookie, uint grfAttribs)
        {
            return VSConstants.S_OK;
        }

        public int OnBeforeDocumentWindowShow(uint docCookie, int fFirstShow, IVsWindowFrame pFrame)
        {
            return VSConstants.S_OK;
        }

        public int OnAfterDocumentWindowHide(uint docCookie, IVsWindowFrame pFrame)
        {
            return VSConstants.S_OK;
        }

        public int OnAfterAttributeChangeEx(uint docCookie, uint grfAttribs, IVsHierarchy pHierOld, uint itemidOld, string pszMkDocumentOld, IVsHierarchy pHierNew, uint itemidNew, string pszMkDocumentNew)
        {
            return VSConstants.S_OK;
        }

        public int OnBeforeSave(uint docCookie)
        {
            /////// MY CODE ////////
            return VSConstants.S_OK;
        }

        #endregion Methods
    }
}

答案 1 :(得分:0)

DTE.Events.DocumentEvents适用于已打开的项目文件,而不适用于整个项目系统。解决方案资源管理器中加载和显示的每个项目都由项目系统为该项目的类型加载。因此,不同版本的项目有自己的项目系统实现。

根据您的要求,您需要实施IVsSolutionEvents3以通知正在加载/卸载的项目。并通过SVsSolutionBuildManager服务在包初始化代码中将该对象注册为侦听器。

然后实现IVsHierarchyEvents以通知项目更改,并在传递给IVsSolutionEvents3的OnAfterProjectOpen实现的IVsHierarchy对象上调用AdviseHierarchyEvents以注册事件侦听器对象。

更详细的说明,请参阅以下主题。

Visual Studio SDK - Handling File Add, Remove, and Rename Events