如何在visual studio 2017 sdk 中拦截项目保存事件?
How to intercept project save event in visual studio 2017 sdk?
在visual studio2017 sdk中可以拦截工程保存事件吗?
更新
我目前正在开发 visual studio 2017 的扩展,我需要知道何时保留任何更改。
例如:当我在项目中添加一个新的引用时(我知道有添加/更改/删除引用的事件但不符合我的需要),该项目被标记为待保存。我需要在保存时拦截它(如果在保存之前更好)。
我尝试了Dte.Events.DocumentEvents.DocumentSaved
事件,但在保存项目中没有触发; DTE.Events.SolutionEvents
和 DTE.Events.SolutionItemEvents
没有我需要的类型的事件。
有可能吗?
DTE.Events.DocumentEvents 适用于打开的项目文件,而不是整个项目系统。解决方案资源管理器中加载和显示的每个项目都由该项目类型的项目系统加载。所以不同版本的项目都有自己的项目系统实现。
根据您的要求,您需要实施 IVsSolutionEvents3 才能收到项目 loaded/unloaded 的通知。并通过 SVsSolutionBuildManager 服务将该对象注册为包初始化代码中的侦听器。
然后实现 IVsHierarchyEvents 以获得项目更改的通知,并在传递给 IVsSolutionEvents3 的 OnAfterProjectOpen 实现的 IVsHierarchy 对象上调用 AdviseHierarchyEvents 以注册事件侦听器对象。
更详细的解释,请参考下贴
在这种情况下正确的做法是使用实现 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
}
}
在visual studio2017 sdk中可以拦截工程保存事件吗?
更新
我目前正在开发 visual studio 2017 的扩展,我需要知道何时保留任何更改。
例如:当我在项目中添加一个新的引用时(我知道有添加/更改/删除引用的事件但不符合我的需要),该项目被标记为待保存。我需要在保存时拦截它(如果在保存之前更好)。
我尝试了Dte.Events.DocumentEvents.DocumentSaved
事件,但在保存项目中没有触发; DTE.Events.SolutionEvents
和 DTE.Events.SolutionItemEvents
没有我需要的类型的事件。
有可能吗?
DTE.Events.DocumentEvents 适用于打开的项目文件,而不是整个项目系统。解决方案资源管理器中加载和显示的每个项目都由该项目类型的项目系统加载。所以不同版本的项目都有自己的项目系统实现。
根据您的要求,您需要实施 IVsSolutionEvents3 才能收到项目 loaded/unloaded 的通知。并通过 SVsSolutionBuildManager 服务将该对象注册为包初始化代码中的侦听器。
然后实现 IVsHierarchyEvents 以获得项目更改的通知,并在传递给 IVsSolutionEvents3 的 OnAfterProjectOpen 实现的 IVsHierarchy 对象上调用 AdviseHierarchyEvents 以注册事件侦听器对象。
更详细的解释,请参考下贴
在这种情况下正确的做法是使用实现 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
}
}