我正在考虑为visual sudio 2010添加一种新的编程语言,而且我对最佳方法感到有些困惑。
我已经查看了MPF,并找到了一些关于如何进行语法高亮,链接外部解析器等的示例,这看起来非常简单。
然后我读到了一些名为MEF的东西以及它是如何成为visual studio的新扩展性模型。我已经玩过了,我已经通过跟踪一些样本突出了我的语法。现在,对于MEF,我迷失了我在解析器中为我的语言链接的方式,就像使用ParseSOurce的MPF一样,等等。我使用ANTLR顺便说一下。
MEF仅仅是针对编辑器的视觉方面,如突出显示,装饰等......还是可以/建议用它来实现语言服务?
从我收集的内容来看,MEF是一种新推荐的方法,但创建新语言似乎比使用常规MPF更难。 MPF仍然是一个好方法吗?
答案 0 :(得分:5)
MEF(托管扩展性框架)是.NET中用于扩展程序(如Visual Studio)的通用编程方法。 VS包/扩展可以使用较新的VS-MEF类(合同)而不是MPF类。 MEF由装饰有[Export]
属性的类识别。一般来说,你继承了一个特定的类,如一个可着色的项目,并将其导出到Visual Studio,然后查找MEF包中的所有导出并导入它们。
MPF(托管包框架)就像围绕非托管/本机VS扩展模型的旧COM包装器的类系统。您通过获取服务并实现MPF类的方法以编程方式扩展Visual Studio(MPF类依次实现VS的COM包装器的类COM接口。例如LanguageService
实现IVsLanguageInfo
和其他一些接口,但它只是简单地收集那些接口的方法,然后你可以在LanguageService
实现类中覆盖它们。
如果要实现完整的编程语言,可以将MPF和MEF结合使用。您可以将MEF用于编辑器部分,例如标记化(语法突出显示所需),大纲,大括号匹配等,以及MPF用于其他VS的东西,如新工具窗口,属性页等。
您也可以使用较旧的COM包装器而不是MPF,但MPF类已经为您执行了一些COM工作,如果选择COM包装器,则需要处理它们。
您也可以使用MPF实现标记器等,但我尝试了它并发现它比MEF更直观。如果你问我,它比MEF要困难得多,需要更多的脑筋急转弯,但我还没有像使用MPF那样得到MEF。
这对我自己有点困惑,因为我注意到MSDN混合了MEF和MPF的文章。您需要仔细观察MSDN的哪个子部分,您可以轻松地从MEF类别切换到MPF。 但是,MSDN向您提示有关扩展VS的一般文章中的内容,例如:http://msdn.microsoft.com/en-us/library/cc138569.aspx
答案 1 :(得分:1)
我目前正在使用MEF专门实施语言服务(在VS2013中)。
除了语法突出显示(您可以使用ITagger<ClassificationTag>
)和一些其他内置的特定用途MEF接口(例如,用于选项页面和各种类型的智能感知),您可以根据需要实现,做背景解析之类的事情你通常会实现IVsTextViewCreationListener
并在打开文件时执行操作;或者,您可以使用包的Initialize
方法作为入口点在后台遍历项目层次结构。
Intellisense功能等通常会要求您响应某个命令(或监视击键以了解何时弹出完成列表框);您可以通过实现IOleCommandTarget
并处理相关命令来处理此问题(在创建文本视图时,通过调用AddCommandFilter
上的IVsTextView
手动挂钩命令处理程序。)
到目前为止,我还没有碰到任何我不能通过MEF做的事情(除了根本无法完成的事情);我从未真正研究过MPF,因为我不需要它。
(请注意,在一天结束时,代码往往类似于MEF管道,VS SDK接口和帮助程序类以及EnvDTE goop。)
答案 2 :(得分:1)
将MEF用于通过MEF曝光的功能。其他功能将根据具体情况进行处理(如果您在实施特定功能时遇到问题,请询问具体问题)。我仍然使用MPF的唯一方法是项目系统(项目的MPF,或MPFProj)。为了处理后台解析,我建议您查看我的BackgroundParser
实现(MIT许可证)。它工作得很好,虽然回头看我希望我使用TPL并使ReParseImpl
返回Task
而不是同步执行。
0d3e55e
,展示了BackgroundParser
的介绍和使用以及一些必需的辅助类。