Visual Studio 2010 MEF与MPF?

时间:2012-05-30 20:34:13

标签: c# visual-studio mef vs-extensibility mpf

我正在考虑为visual sudio 2010添加一种新的编程语言,而且我对最佳方法感到有些困惑。

我已经查看了MPF,并找到了一些关于如何进行语法高亮,链接外部解析器等的示例,这看起来非常简单。

然后我读到了一些名为MEF的东西以及它是如何成为visual studio的新扩展性模型。我已经玩过了,我已经通过跟踪一些样本突出了我的语法。现在,对于MEF,我迷失了我在解析器中为我的语言链接的方式,就像使用ParseSOurce的MPF一样,等等。我使用ANTLR顺便说一下。

MEF仅仅是针对编辑器的视觉方面,如突出显示,装饰等......还是可以/建议用它来实现语言服务?

从我收集的内容来看,MEF是一种新推荐的方法,但创建新语言似乎比使用常规MPF更难。 MPF仍然是一个好方法吗?

3 个答案:

答案 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而不是同步执行。