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

问题描述:

可以在Visual Studio 2017 sdk中拦截项目保存事件吗?如何拦截visual studio 2017 sdk中的项目保存事件?

UPDATE

我目前正在开发的Visual Studio 2017年的扩展,在我需要的时候任何变化坚持就知道了。例如:当我在项目中添加一个新的引用(我知道有引用添加/更改/删除但未满足需要的事件时),项目被标记为待保存。当它被保存时我需要拦截它(如果它在保存之前更好)。

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

有可能吗?

+0

如果我发布答案*是的,这是可能的*,将是足以没有我添加任何细节?如果不是的话,那么你的问题就是范围过于模糊和广泛,你应该[编辑]更具体地说明你在问什么。 –

+0

@KenWhite你是对的!我编辑了我的问题... –

+0

好多了。撤回我的近距离投票。谢谢。 –

正确的在这种情况下是使用实施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 
    } 
} 

DTE.Events.DocumentEvents与打开的项目文件一起使用,而不是整个项目系统。加载并显示在解决方案资源管理器中的每个项目都由该项目类型的项目系统加载。所以不同版本的项目有自己的项目系统实施。

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

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

更详细的解释请参考下面的主题。

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

+0

我能够按照上述方式实施,但是,仍然没有事件可以保存项目。那里存在的方法被激发了好几次,并且不适合我需要的东西。 还有别的办法吗? 如果它不存在,我如何通过实现'IVsHierarchyEvents'来确定项目已经保存? –

+0

您可以添加一个侦听器来监视OnItemAdded()方法。例如,你可以在OnItemAdded()方法中设置一个bool变量。当OnItemAdded调用时,bool变量将被设置为true,这意味着项目层次结构已被更改。 –