用于扩展 Visual Studio 的文档几乎不存在,在撞墙之前,我设法从互联网上的十几个或更多晦涩的源代码中拼凑出几行功能代码。
我需要做的就是订阅一个在插入片段后触发的事件。听起来很容易,至少我是这么想的。几乎立即进入我的研究,我偶然发现了以下内容:
IVsExpansionClient.OnAfterInsertion
这完美地描述了我的意图,所以这一定是答案!在查看我的 SDK 程序集比我愿意承认的时间长之后,我最终将程序集 (Microsoft.VisualStudio.TextManager.Interop.8.0.dll) 从我的 GAC 中拉出来,以便我可以在我的解决方案中明确引用它。
现在我可以访问该接口(interface),我只需要弄清楚如何获取它的一个实例。
IVsExpansionManager
啊哈!那必须以某种方式为我提供一种获取 IVsExpansionClient 实例的机制,对吗?好吧,不完全是。至少不是以我能看到的方式。我拼接了以下代码:
IVsExpansionManager expansionManager = null; IVsTextManager2 textManager = (IVsTextManager2)Package.GetGlobalService(typeof(SVsTextManager)); int manager = textManager.GetExpansionManager(out expansionManager);
这给了我一个 IVsExpansionManager COM 对象,但这是我所能得到的。
我已经注意到另一个潜在的提供者:
IVsExpansionEvents
我想也许像解决方案事件、文档事件、窗口事件或文本事件,我可以调用 DTE 来挂接这些事件,但它们似乎不存在。
有些方法接受 IVsExpansionClient 作为参数,例如:
IVsExpansion.InsertNamedExpansion
所以必须有一种方法来获取这个对象的实例,对吧?我想可以创建我自己的实现 IVsExpansionClient 接口(interface)的类,但我不知道从哪里开始实现接口(interface)成员,而且我仍然不知道如何在我的包中以有意义的方式实例化它。
我很感谢任何能给我指明不同方向或提供我可以根据我的需要进行调整的工作示例的人。感谢您花时间阅读本文,感谢您抽出宝贵时间。
编辑:我想收到一个通知,说明一个片段已被插入到事件文档窗口中。理想情况下,我希望代码段本身包含在委托(delegate)事件参数中,因为我需要对插入的代码段进行一些处理......处理整个文档或尝试识别最近插入的代码段会很麻烦没有上下文。
最佳答案
也许您想解释一下您真正想要实现的目标。 IVsExpansionClient
接口(interface)的文档说明:
Notes to implementers This interface is implemented by a
VSPackage
that supports insertion of code snippets.
我不明白为什么有人想要使用它的一个实例,因为它是一个允许包接收通知/回调的接口(interface),如果与代码片段相关的事情将要发生(它不提供其他任何东西)比回调函数)。
它进一步说明...
Notes to Callers This interface is instantiated and passed to the
InvokeInsertionUI
method in theIVsExpansionManager
interface. This interface is also instantiated and passed to the methods in theIVsExpansion
interface.
关于c# - 如何在 VSPackage 中获取 IVsExpansionClient 的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31955693/