C# 如何在VSPackage中获取IVsExpansionClient实例?

C# 如何在VSPackage中获取IVsExpansionClient实例?,c#,.net,visual-studio-extensions,vsx,vspackage,C#,.net,Visual Studio Extensions,Vsx,Vspackage,扩展VisualStudio的文档实际上是不存在的,在撞上一堵砖墙之前,我设法在互联网上汇编了几行从十几个或更多模糊来源拼凑而成的功能代码 我所需要做的就是订阅一个事件,该事件在插入代码段后被触发。听起来很简单,至少我是这么想的。几乎在我进行研究的一瞬间,我偶然发现了以下几点: IVsExpansionClient.on插入后 这完美地描述了我的意图,所以这一定是答案!在查看SDK程序集的时间比我想承认的要长之后,我最终将程序集(Microsoft.VisualStudio.TextManage

扩展VisualStudio的文档实际上是不存在的,在撞上一堵砖墙之前,我设法在互联网上汇编了几行从十几个或更多模糊来源拼凑而成的功能代码

我所需要做的就是订阅一个事件,该事件在插入代码段后被触发。听起来很简单,至少我是这么想的。几乎在我进行研究的一瞬间,我偶然发现了以下几点:

IVsExpansionClient.on插入后

这完美地描述了我的意图,所以这一定是答案!在查看SDK程序集的时间比我想承认的要长之后,我最终将程序集(Microsoft.VisualStudio.TextManager.Interop.8.0.dll)从GAC中拉出,以便在解决方案中明确引用它

现在我可以访问这个接口了,我只需要弄清楚如何获取它的一个实例

IVsExpansionManager

啊哈!这一定为我提供了获取IVsExpansionClient实例的机制,对吧?嗯,不完全是这样。至少我看不出来。我已将以下代码缝合在一起:

IVsExpansionManager扩展管理器=null;IVsTextManager2 文本管理器= (IVsTextManager2)Package.GetGlobalService(typeof(SVsTextManager));int manager=textManager.GetExpansionManager(out expansionManager)

这给了我一个IVsExpansionManager COM对象,但这是我所能得到的

我已注意到另一个潜在供应商:

IV六泛事件

我想,也许像解决方案事件、文档事件、窗口事件或文本事件一样,我可以调用DTE来钩住这些事件,但它们似乎不存在

有一些方法接受IVsExpansionClient作为参数,例如:

IVsExpansion.InsertNamedExpansion

所以必须有一种方法来获取这个对象的实例,对吗?我认为可以创建自己的类来实现IVsExpansionClient接口,但我不知道从何处开始实现接口成员,我仍然不知道如何在包中以有意义的方式实例化它

我很感谢任何能为我指出不同方向的人,或是能为我提供适合我需要的工作样本的人。感谢您抽出时间通读这篇文章,我感谢您抽出时间


编辑:我希望收到一个通知,告知已将代码段插入活动文档窗口。理想情况下,我希望代码段本身包含在委托事件参数中,因为我需要对插入的代码段进行一些处理……处理整个文档或尝试在没有上下文的情况下识别最近插入的代码段会很麻烦。

也许您想解释一下您实际想要实现的目标。
IVsExpansionClient
接口的文档说明:

实施者须知 此接口由支持插入代码段的
VSPackage
实现

我不明白为什么要使用它的实例,因为它是一个接口,允许包接收通知/回调,如果与代码片段相关的事情即将发生(它只提供回调函数)

它还指出

来电者须知 该接口被实例化并传递给
IVsExpansionManager
接口中的
InvokeInsertionUI
方法。该接口也被实例化并传递给
IVsExpansion
接口中的方法


我想要实现的是:我想要收到一个通知,告诉我一个代码段已经插入到活动文档窗口中。理想情况下,我希望代码段本身包含在委托事件参数中,因为我需要对插入的代码段进行一些处理……处理整个文档或尝试在没有上下文的情况下识别最近插入的代码段会很麻烦。您对如何实现这一点有什么建议吗?您称之为代码片段的是什么?任何代码段?或从IDE保存的代码段?VS代码段。它位于每个VisualStudio代码段目录中。允许您通过键入“prop”和制表符插入属性声明的XML?我的小组使用了几十个自定义代码段,当插入VisualStudio代码段时,我需要收到通知,类似于键入“prop”和制表符。