我正在开发一个 Visual Studio 扩展,当用户在当前解决方案中添加、删除或重命名文件时,该扩展应该侦听事件。
答案是这个问题注意到 VS 提供了用于监听文档事件的基础设施,例如通过文档事件界面。例如:
Dte.Events.DocumentEvents.DocumentSaved
是否有类似的事件允许我监听用户添加/删除/重命名文档?
首先,如果可以的话,不要使用 DTE。这是一个非常不完整、不稳定的抽象,覆盖在一个极其复杂的界面上。话虽如此,我承认有时它非常方便,因为没有它就无法完成等效操作(罕见),或者替代代码会很长(不太罕见)。
这里混淆了两个概念。第一个是运行文档表(RDT)。 RDT 代表所有打开的文件(包括打开的 .sln 和项目文件)。您可以订阅 RDT 事件,以便在文件被打开、关闭、重命名等时收到通知。但这些事件仅适用于打开的文件!
第二个概念是项目制。解决方案资源管理器中加载和显示的每个项目均由该项目类型的项目系统加载。 C++ 项目、C# 项目、F# 项目、WIX 安装程序项目等都有不同的项目系统。甚至可以通过扩展实现自定义项目系统。听起来您想了解项目系统中的事件,而不是(仅)打开文件的事件。所以你的重点是项目系统。然而,由于所有项目系统都有不同的实现,这变得非常棘手。 VS 正在向通用项目系统 (CPS) 迈进,但还没有 100% 实现,即使实现了,仍然存在所有遗留扩展等问题。
您可以订阅所有项目系统必须提供的常规“层次结构”事件。例如,他们会告诉您何时添加或删除文件(实际上,当添加或删除层次结构项目(节点)时,因为文件和层次结构项目之间不一定存在对应关系)。还有一个事件表明整个层次结构已失效 - 一种刷新,您必须放弃您所了解的有关项目的所有信息并收集新信息。
重命名可能是最难检测的事情。每个项目系统的实现方式都不同。在某些项目系统中,重命名将表现为节点删除,然后添加节点,没有可靠的方法来识别这是由于重命名造成的。
总而言之,没有什么事情像看起来那么简单,特别是当涉及到项目系统(Visual Studio 中可扩展性最差的部分之一)时。您最终可能会得到特定于一个或少数项目系统的代码,但不能普遍工作。 (毕竟,并非所有项目都代表文件层次结构!而那些确实代表文件层次结构的项目仍然具有文件夹、特殊参考节点等,但它们不是文件。)
一些正确方向的具体指针:
- 实施
IVsSolutionEvents3
收到项目正在加载/卸载的通知(以及IVsSolutionEvents4
收到项目本身被重命名的通知)。通过以下方式在包初始化代码中将该对象注册为侦听器(确保在打开解决方案之前加载包)SVsSolution
服务(投射到IVsSolution
并打电话AdviseSolutionEvents
on it).
- 实施
IVsHierarchyEvents
收到项目更改的通知,例如节点属性更改(使用__VSHPROPID
枚举以找出哪个是哪个),节点被添加、删除、失效等。调用AdviseHierarchyEvents
on the IVsHierarchy
对象传递给IVsSolutionEvents3
's OnAfterProjectOpen
实现注册事件监听器对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)