【问题标题】:Duplicate Visual Studio Extension For Single Language单一语言的重复 Visual Studio 扩展
【发布时间】:2016-07-07 13:12:34
【问题描述】:

我是 Extension 的新手,正在编写 VS 扩展,并查找有关该主题的信息,例如解开 3 个毛线球。我在 MSDN 网站上阅读了很多内容,也做了很多失败的谷歌搜索。

我的目标是编写一个 Visual Studio 扩展(使用 MEF 和 MPF)来改进对由第 3 方创建的语言的支持。第 3 方已经有一个 VS 扩展,它支持调试以及最小的 Intellisense,并提供着色。我不想失去他们的调试支持,但我确实想改善体验的其他各个方面。

据我了解,给定语言(内容类型)只能由一个 LanguageService 和/或一组通过 MEF(着色、智能感知等)的编辑器服务支持。它是否正确?是否可以替换他们现有的 Intellisense,并添加其他功能?

【问题讨论】:

  • 旁注:使用 VS 扩展时,一个好的 .NET 反编译器(我喜欢 dotPeek)是你最好的朋友。很大一部分 VS 是用托管代码编写的,可以反编译以了解一些更晦涩的内部工作原理,更不用说你所说的第 3 方的那些了。

标签: visual-studio mef vsix mpf


【解决方案1】:

是的,只要稍加努力,您就可以绕过他们的语言服务注册,并为相同的文件扩展名注册您自己的服务。语言服务几乎独立于调试引擎(我之所以这么说是因为在设计时放置断点等一些小事情会通过一些语言服务对象,但这并不是很重要)。

我建议用你的完全取代他们的语言服务,这比试图在不破坏它的情况下增加他们的语言服务要简单得多,尤其是在无法访问他们的源代码进行更改的情况下。

大多数注册都是通过注册表中的条目绑定的,例如在HKCU\Software\Microsoft\VisualStudio\14.0_Config\。这对于 MEF 组件不是正确,但 MEF 组件倾向于按内容类型进行过滤,内容类型由语言服务定义,因此只要您在您的语言服务并将你的东西绑定到那个。

您可以为相同的文件扩展名注册语言服务,但具有更高的优先级(通过语言服务包上的ProvideEditorExtension 属性)。然后,这完全取决于您的语言服务,您不必担心他们的服务会妨碍您(只要它的行为不是它自己的内容类型,它就应该这样做)。

最后,祝你好运!从头开始编写(好的)语言服务可能是一段漫长的旅程:-)

【讨论】:

  • 如果您有后续问题,请在此处的 cmets 中添加链接,因为我不经常浏览 [vsix] 问题标签 ;-)
  • 谢谢@Cameron。到目前为止,使用 MEF 组件时似乎根本不需要 LanguageService。它们似乎重叠,我在 LanguageService 中没有看到任何附加功能。我对此是否正确,还是我错过了什么?这可能是一个不同的问题,但你已经回答了我的 OP。
  • 对,MEF 与语言服务注册是正交的,但是您希望语言服务拥有的许多服务都是通过 MEF 组件公开的(例如语法突出显示、补全)。大多数 MEF 组件都注册了特定的内容类型,这是它们与语言服务(定义该内容类型)之间的链接。语言服务本身并没有多大作用。与其内容类型挂钩的其他所有内容都可以完成繁重的工作。对不起,我的反应时间太慢了!
猜你喜欢
  • 2018-12-28
  • 2018-07-21
  • 2018-08-23
  • 1970-01-01
  • 1970-01-01
  • 2019-01-25
  • 2022-01-10
  • 2017-09-13
相关资源
最近更新 更多