我正在开发一个Visual Studio扩展,当用户在当前解决方案中添加,删除或重命名文件时,该扩展应侦听事件。
在回答这个问题指出,VS收听喜欢保存,打开并通过关闭文档事件提供基础设施DocumentEvents接口。例如:
Dte.Events.DocumentEvents.DocumentSaved
是否有类似的事件可以让我听用户添加/删除/重命名文档?
首先,如果可以帮助,请不要使用DTE。这是一个非常不完整,不稳定的抽象,记录在一个非常复杂的界面上。话虽如此,我承认有时候这非常方便,因为如果没有它(稀有)或替代代码将相当长(很少见),那么等效操作就无法完成。
这里有两个概念被合并。第一个是运行文档表(RDT)。RDT代表所有打开的文件(包括打开的.sln和项目文件)。您可以订阅RDT事件,以通知它们正在打开,关闭,重命名等文件。但是这些事件仅适用于打开的文件!
第二个概念是项目系统。解决方案资源管理器中加载并显示的每个项目均由该项目类型的项目系统加载。C ++项目,C#项目,F#项目,WIX安装程序项目等都有不同的项目系统。甚至可能有扩展实现的自定义项目系统。听起来您想了解项目系统中的事件,而不是(仅)打开文件的事件。因此,您的重点是项目系统。但是,由于所有项目系统都有不同的实现,因此这变得非常棘手。VS正朝着通用项目系统(CPS)迈进,但目前还不是100%,即使存在,也仍然存在所有旧版扩展等问题。
您可以订阅所有项目系统都必须提供的常规“层次结构”事件。例如,它们会告诉您何时添加或删除文件(实际上是何时添加或删除层次结构项(节点),因为文件与层次结构项之间不一定存在对应关系)。还有一个事件表明整个层次结构已失效-这是一种刷新,您必须丢弃对项目了解的所有信息并收集新信息。
重命名可能是最难检测的。每个项目系统都以不同的方式实现它。在某些项目系统中,重命名将自己显示为节点删除,然后再添加节点,而没有可靠的方法来确定它是由于重命名而来的。
综上所述,没有什么看起来简单,特别是涉及项目系统(Visual Studio扩展性最差的部分之一)时。您可能最终会获得特定于一个或少数几个项目系统的代码,但无法普遍运行。(毕竟,并非所有项目都代表文件层次结构!那些仍然具有文件夹,特殊参考节点等不是文件的项目。)
正确方向的一些具体指针:
IVsSolutionEvents3
以通知项目正在加载/卸载(并IVsSolutionEvents4
通知项目本身已重命名)。通过SVsSolutionBuildManager
服务(IVsSolutionBuildManager3
广播并调用AdviseUpdateSolutionEvents3
它)在程序包初始化代码(确保在打开解决方案之前已装入程序包)中将该对象注册为侦听器。IVsHierarchyEvents
以通知项目更改,例如节点属性更改(使用__VSHPROPID
枚举来找出是哪个),节点被添加,移除,失效等。通知传递给的实现AdviseHierarchyEvents
的IVsHierarchy
对象以注册事件侦听器对象。IVsSolutionEvents3
OnAfterProjectOpen
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句