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