如何在VSPackage中获取IVsExpansionClient实例?

时间:2015-08-12 03:49:29

标签: c# .net visual-studio-extensions vsx vspackage

扩展Visual Studio的文档实际上是不存在的,我设法在撞到砖墙之前,从十几个或更多隐蔽的源周围组装了几行功能代码。

我需要做的就是订阅插入代码段后触发的事件。听起来很容易,或者我想。几乎立即进入我的研究,我偶然发现了以下几点:

  

IVsExpansionClient.OnAfterInsertion

这完全描述了我的意图,所以这必须是答案!在查看我的SDK程序集的时间超过了我想承认的时间之后,我终于最终从我的GAC中取消了程序集(Microsoft.VisualStudio.TextManager.Interop.8.0.dll),以便我可以在我的解决方案中明确引用它。

现在我可以访问界面,我只需要弄清楚如何获取它的实例。

  

IVsExpansionManager

啊哈哈!那必须以某种方式为我提供一个获取IVsExpansionClient实例的机制,对吧?好吧,不完全是。至少不是我能看到的方式。我已将以下代码拼接在一起:

  

IVsExpansionManager expansionManager = null; IVsTextManager2   textManager =   (IVsTextManager2)Package.GetGlobalService(typeof运算(SVsTextManager)); INT   manager = textManager.GetExpansionManager(out expandManager);

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

我注意到了另一个潜在的提供者:

  

IVsExpansionEvents

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

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

  

IVsExpansion.InsertNamedExpansion

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

我很感激任何能指出我不同方向的人,或者提供一个可以根据我的需求调整的工作样本。感谢您花时间阅读本文,感谢您的时间。

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

1 个答案:

答案 0 :(得分:0)

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

  

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

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

它还说明了......

  

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