6

我正在考虑在 Visual sudio 2010 中添加一种新的编程语言,但我对采用的最佳方法有点困惑。

我查看了 MPF 并找到了一些关于如何进行语法突出显示、链接外部解析器等的示例,它看起来非常简单。

然后我读到了一个叫做 MEF 的东西,以及它是如何成为 Visual Studio 的新可扩展模型的。我已经玩过它,并且通过遵循一些示例,我的语法突出显示工作。现在,有了 MEF,我不知道如何在我的解析器中链接我的语言,就像 MPF 使用 ParseSource 等一样。我正在使用 ANTLR 顺便说一句。

MEF 是否仅用于编辑器的视觉方面,例如突出显示、装饰等……或者是否可以/建议使用它来实现语言服务?

据我所知,MEF 是新的推荐方法,但创建新语言似乎比使用常规 MPF 更难。强积金仍然是一个好方法吗?

4

3 回答 3

5

MEF(托管可扩展性框架)是 .NET 中用于扩展程序(如 Visual Studio)的通用编程方法。VS 包/扩展可以使用较新的 VS-MEF 类(契约)而不是 MPF 类。MEF 被用[Export]属性修饰的类识别。一般来说,您继承一个特定的类(如可着色项)并将其导出到 Visual Studio,然后 Visual Studio 会查找 MEF 包中的所有导出并导入它们。

MPF(托管包框架)就像一个围绕非托管/本机 VS 扩展模型的旧 COM 包装器的类系统。您通过获取服务和实现 MPF 类的方法以编程方式扩展 Visual Studio(MPF 类反过来实现 VS 的 COM 包装器的类 COM 接口。例如LanguageService实现IVsLanguageInfo和一些其他接口,但它只是简单地“收集”这些方法然后您可以在LanguageService实现类中覆盖该接口)。

如果你想实现一个完整的编程语言,你将结合 MPF 和 MEF。您将 MEF 用于编辑器部分,如标记化(语法高亮需要)、大纲、大括号匹配等,而 MPF 用于其他 VS 内容,如新工具窗口、属性页等。

除了 MPF,您还可以使用较旧的 COM 包装器,但 MPF 类已经为您完成了一些 COM 工作,如果您选择 COM 包装器,您将不得不处理这些工作。

您也可以使用 MPF 实现标记器等,但我尝试过,发现它比 MEF 更不直观。如果你问我,它比 MEF 更难,并且需要更多的脑损伤,但我在 MEF 上还没有像 MPF 那样走得那么远。

这让我自己有点困惑,因为我注意到 MSDN 混淆了 MEF 和 MPF 的文章。您需要非常仔细地查看您进入 MSDN 的哪个小节,您可以轻松地从 MEF 类别意外切换到 MPF。但是,MSDN 在一些关于扩展 VS 的一般文章中提示您什么是什么,例如:http: //msdn.microsoft.com/en-us/library/cc138569.aspx

于 2014-06-16T11:23:24.437 回答
1

我目前正在专门使用 MEF(在 VS2013 中)实现语言服务。

除了语法高亮(你可以用 来做ITagger<ClassificationTag>)和其他一些内置的特定用途的 MEF 接口(例如,用于选项页面和各种类型的智能感知)之外,你可以根据需要来执行诸如背景解析之类的事情通常IVsTextViewCreationListener在打开文件时执行并执行操作;或者,您可以使用包的Initialize方法作为入口点在后台遍历项目层次结构。

Intellisense 功能等通常会要求您响应某个命令(或监控击键以了解何时弹出完成列表框,例如);您可以通过实现和处理相关命令来处理这个问题(您可以通过在创建文本视图时IOleCommandTarget调用手动挂钩命令处理程序)。AddCommandFilterIVsTextView

到目前为止,我还没有遇到任何我不能通过 MEF 做的事情(除了那些根本不能做的事情);我从来没有真正研究过强积金,因为我不需要它。

(请注意,归根结底,代码往往类似于 MEF 管道、VS SDK 接口和帮助程序类以及 EnvDTE goop 的汤。)

于 2014-06-16T21:44:34.177 回答
1

将 MEF 用于通过 MEF 公开的功能。其他功能将根据具体情况进行处理(如果您在实现特定功能时遇到问题,请询问具体问题)。我唯一仍然使用 MPF 的是项目系统(MPF for Projects,或MPFProj)。要处理后台解析,我建议查看我的BackgroundParser实现(MIT 许可证)。它工作得很好,虽然回想起来我希望我使用 TPL 并ReParseImpl返回 aTask而不是同步执行。

于 2014-06-16T23:20:39.530 回答