编辑器中的托管扩展性框架

编辑器是使用托管扩展性框架 (MEF) 组件生成的。 可以生成自己的 MEF 组件来扩展编辑器,代码还可以使用编辑器组件。

MEF 是一个 .NET 库,可用于添加和修改遵循 MEF 编程模型的应用程序或组件的功能。 Visual Studio 编辑器可以提供和使用 MEF 组件部件。

MEF 包含在 .NET Framework 版本 4 System.ComponentModel.Composition.dll 程序集中。

有关 MEF 的详细信息,请参阅 Managed Extensibility Framework (MEF)

组件部件和组合容器

组件部件是一个类或一个类的成员,可以执行下列一项(或两者)操作:

  • 使用另一个组件

  • 由另一个组件使用

    例如,假设购物应用程序有一个订单输入组件,该组件依赖于仓库库存组件提供的产品可用性数据。 在 MEF 术语中,库存部件可以 导出 产品可用性数据,订单输入部件可以 导入 数据。 订单输入部分和库存部件不必相互了解; 组合容器 (由主机应用程序提供)负责维护一组导出,并解析导出和导入。

    合成容器 CompositionContainer通常由主机拥有。 合成容器维护 导出组件部件的目录

导出和导入组件部件

只要它作为公共类或类(属性或方法)的公共成员实现,就可以导出任何功能。 不必从 ComposablePart中派生组件部件。 相反,必须将属性 ExportAttribute 添加到要导出的类或类成员。 此属性指定 另一个组件部件可以导入功能的协定

导出协定

定义 ExportAttribute 要导出的实体(类、接口或结构)。 通常,导出属性采用指定导出类型的参数。

[Export(typeof(ContentTypeDefinition))]
class TestContentTypeDefinition : ContentTypeDefinition {   }

默认情况下,该 ExportAttribute 属性定义一个协定,该协定是导出类的类型。

[Export]
[Name("Structure")]
[Order(After = "Selection", Before = "Text")]
class TestAdornmentLayerDefinition : AdornmentLayerDefinition {   }

在此示例中,默认 [Export] 属性等效于 [Export(typeof(TestAdornmentLayerDefinition))].

还可以导出属性或方法,如以下示例所示。

[Export]
[Name("Scarlet")]
[Order(After = "Selection", Before = "Text")]
public AdornmentLayerDefinition scarletLayerDefinition;

导入 MEF 导出

如果要使用 MEF 导出,必须知道导出它的协定(通常是类型),并添加 ImportAttribute 具有该值的属性。 默认情况下,导入属性采用一个参数,这是它修改的类的类型。 以下代码行导入类型 IClassificationTypeRegistryService

[Import]
internal IClassificationTypeRegistryService ClassificationRegistry;

排查导入/导出问题:访问 MEF 组合错误日志

如果尝试导入当前 VS 安装中不存在的内容,或者错误地创作导入或导出,则可能会遇到问题。 查找和解决这些问题的主要方法是引用 托管扩展性框架(MEF)组合错误日志,存储在 %localappdata%\Microsoft\VisualStudio[yourVSVersion]\ComponentModelCache\Microsoft.VisualStudio.Default.err

从 MEF 组件部件获取编辑器功能

如果现有代码是 MEF 组件部件,则可以使用 MEF 元数据来使用编辑器组件部件。

使用 MEF 组件部件中的编辑器功能

  1. 添加对 System.Composition.ComponentModel.dll(全局程序集缓存 (GAC)和编辑器程序集的引用。

  2. 添加相关的 using 指令。

    using System.ComponentModel.Composition;
    using Microsoft.VisualStudio.Text;
    
  3. [Import] 属性添加到服务接口,如下所示。

    [Import]
    ITextBufferFactoryService textBufferService;
    
  4. 获取服务后,可以使用其任何一个组件。

  5. 编译程序集后,将其放入 *.。Visual Studio 安装的 \Common7\IDE\Components* 文件夹。