编辑器中的托管扩展性框架
编辑器是使用托管扩展性框架 (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 组件部件中的编辑器功能
添加对 System.Composition.ComponentModel.dll(全局程序集缓存 (GAC)和编辑器程序集的引用。
添加相关的 using 指令。
using System.ComponentModel.Composition; using Microsoft.VisualStudio.Text;
将
[Import]
属性添加到服务接口,如下所示。[Import] ITextBufferFactoryService textBufferService;
获取服务后,可以使用其任何一个组件。
编译程序集后,将其放入 *.。Visual Studio 安装的 \Common7\IDE\Components* 文件夹。