编辑器是使用托管扩展性框架 (MEF) 组件生成的。 您可以构建自己的 MEF 组件来扩展编辑器,并且您的代码还可以使用编辑器组件。
MEF 是一个 .NET 库,可用于添加和修改遵循 MEF 编程模型的应用程序或组件的功能。 Visual Studio 编辑器可以提供和使用 MEF 组件。
MEF 包含在 .NET Framework 版本 4 System.ComponentModel.Composition.dll 程序集中。
有关 MEF 的详细信息,请参阅托管扩展性框架 (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 导出的内容,您必须知道其导出的契约(通常是类型),并添加一个包含该值的属性。 默认情况下,导入属性采用一个参数,这是它修改的类的类型。 以下代码行导入类型 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* 文件夹。