Visual Studio SDK - 处理文件添加、删除和重命名事件



我正在开发一个Visual Studio扩展,当用户在当前解决方案中添加,删除或重命名文件时,该扩展应该侦听事件。

这个问题的答案指出,VS 提供了用于侦听文档事件的基础结构,例如通过 DocumentEvents 接口保存、打开和关闭。例如:

Dte.Events.DocumentEvents.DocumentSaved

是否有类似的事件可以让我侦听用户添加/删除/重命名文档?

首先,如果可以的话,不要使用 DTE。这是一个非常不完整、摇摇欲坠的抽象,覆盖在一个极其复杂的界面上。话虽如此,我承认有时它非常方便,因为没有它就无法完成等效代码(罕见(,或者替代代码会很长(不太罕见(。

这里有两个概念被混为一谈。第一个是运行文档表 (RDT(。RDT 表示所有打开的文件(包括打开的.sln和项目文件(。您可以订阅 RDT 事件,以便在文件正在打开、关闭、重命名等时收到通知。但这些事件仅适用于打开的文件!

第二个概念是项目系统。在解决方案资源管理器中加载和显示的每个项目都由该项目类型的项目系统加载。C++项目、C# 项目、F# 项目、WIX 安装程序项目等都有不同的项目系统。甚至可以通过扩展实现自定义项目系统。听起来您想了解项目系统中的事件,而不是(仅(打开的文件的事件。所以你的重点是项目系统。但是,由于所有项目系统都有不同的实现,因此这变得非常棘手。VS 正在朝着通用项目系统 (CPS( 的方向发展,但它还没有 100% 实现,即使存在,仍然存在所有遗留扩展等问题。

您可以订阅所有项目系统必须提供的常规"层次结构"事件。例如,他们会告诉您何时添加或删除文件(实际上,何时添加或删除层次结构项(节点(,因为文件和层次结构项之间不一定有对应关系(。还有一个事件说整个层次结构都无效了 - 一种刷新,你必须丢弃你所知道的关于项目的所有信息并收集新的信息。

重命名可能是最难检测的事情。每个项目系统的实现方式都不同。在某些项目系统中,重命名将表现为节点删除,然后添加节点,没有可靠的方法来识别它是由于重命名引起的。

总而言之,没有什么事情像看起来那么简单,特别是当涉及到项目系统(Visual Studio最不可扩展的部分之一(时。您最终可能会得到特定于一个或几个项目系统的代码,但不会普遍工作。(毕竟,并非所有项目都代表文件层次结构!以及那些仍然有文件夹、特殊引用节点等不是文件的人。

一些指向正确方向的具体指示:

  • 实现IVsSolutionEvents3,以通知正在加载/卸载项目(以及IVsSolutionEvents4要通知项目本身正在重命名(。通过SVsSolution服务(强制转换为IVsSolution并对其调用AdviseSolutionEvents(将该对象注册为包初始化代码中的侦听器(确保在打开解决方案之前加载包(。
  • 实现IVsHierarchyEvents,以通知项目更改,例如节点属性更改(使用__VSHPROPID枚举找出哪个是哪个(,节点被添加,删除,失效等。 在传递给IVsSolutionEvents3 OnAfterProjectOpen实现的IVsHierarchy对象上调用AdviseHierarchyEvents以注册事件侦听器对象。

您可以订阅 EnvDTE.ProjectsEvents、EnvDTE.ProjectItemsEvents 或 IVsHierarchyEvents。

我知道

这是一篇旧帖子,但对于正在寻找快速解决方案的其他任何人。看看 IVsTrackProjectDocuments2 类,它IVsTrackProjectDocumentsEvents2事件接口匹配。

您将收到所有项目项(非解决方案项!(的通知,包括与以下操作匹配的Solution Items项:

  • 重命名目录
  • 重命名文件

  • 添加目录

  • 添加文件

  • 删除目录

  • 删除文件

  • SccStatusChanged(我猜,它会在文件的源代码管理状态更改后触发。

这些将包含已更改项的数组、其新状态以及发生更新的项目。此外,您还将获得一个VS*FLAGS数组,其中包含有关当前操作的更多信息。

最新更新