【问题标题】:How to intercept project save event in visual studio 2017 sdk?如何在visual studio 2017 sdk中拦截项目保存事件?
【发布时间】:2023-03-07 05:04:01
【问题描述】:

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

更新

我目前正在开发 Visual Studio 2017 的扩展,我需要知道任何更改何时持续存在。

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

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

有可能吗?

【问题讨论】:

  • 如果我发布答案是的,有可能,不添加任何细节就足够了吗?如果不是,那么您的问题过于模糊和范围广泛,您应该edit 更具体地说明您的问题。
  • @KenWhite 你是对的!我编辑了我的问题...
  • 好多了。撤回我的近距离投票。谢谢。

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


【解决方案1】:

在这种情况下,正确的做法是使用实​​现 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
    }
}

【讨论】:

    【解决方案2】:

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

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

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

    更详细的解释,请参考下面的帖子。

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

    【讨论】:

    • 我能够按照上述方式实现,但是仍然没有保存项目的事件。那里存在的方法被触发了几次,并不适合我的需要。还有其他方法吗?如果它不存在,我如何识别该项目是通过实现IVsHierarchyEvents保存的?
    • 您可以添加一个监听器来监控 OnItemAdded() 方法。例如,您可以在 OnItemAdded() 方法中设置一个 bool 变量。当 OnItemAdded 被调用时,bool 变量将被设置为 true,这意味着项目层次结构已经改变。
    猜你喜欢
    • 2017-09-25
    • 2012-04-08
    • 1970-01-01
    • 2020-09-04
    • 2016-08-08
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多