C# 使用MEF在运行时加载插件

C# 使用MEF在运行时加载插件,c#,dynamic,plugins,mef,C#,Dynamic,Plugins,Mef,我的应用程序允许用户编写可以在运行时实例化的插件(实现IPlugin)。启动时,将解析plugin.dll目录,并注册所有可用的插件信息。在运行时,提供了一个GUI,允许用户创建任何插件的实例。这个很好用 但现在我看到了MEF,希望我也能做到这一点,但在代码方面更优雅 到目前为止,我与MEF的合作是什么?:启动时,我正在导入目录中的所有插件(导出IPlugin),并读取诸如名称、类别、作者等信息。。。这些被编码为插件类的导出元数据属性。导入是懒散地完成的,因此启动时不会实例化所有插件,这一点很重

我的应用程序允许用户编写可以在运行时实例化的插件(实现IPlugin)。启动时,将解析plugin.dll目录,并注册所有可用的插件信息。在运行时,提供了一个GUI,允许用户创建任何插件的实例。这个很好用

但现在我看到了MEF,希望我也能做到这一点,但在代码方面更优雅

到目前为止,我与MEF的合作是什么?:启动时,我正在导入目录中的所有插件(导出IPlugin),并读取诸如名称、类别、作者等信息。。。这些被编码为插件类的导出元数据属性。导入是懒散地完成的,因此启动时不会实例化所有插件,这一点很重要

问题是,现在我看不到一种在运行时优雅地实例化所选插件的方法,因为插件构造函数是一个导入构造函数,它正在导入对IPluginHost的引用(它需要立即进行一些初始化)

在启动期间,我将相应的导出与plugininfo一起保存在字典中,这样当GUI请求实例化给定特定plugininfo的插件时,我就可以访问导出(其中Export.Value是我的实际IPlugin)。但从那个里我如何创建插件的实例并用IPluginHost组合它呢

我想我应该编写自己的ExportProvider,在有人要求时为IPluginHost提供服务,但我无法访问程序集或特定插件的类型,因此无法将其添加到目录中,将目录和ExportProvider添加到容器中,并在该容器上调用.composepart

我希望我把问题说清楚了,如果没有,让我试试这个问题的简短版本
MEF的标准用例不是有一个在启动时延迟加载插件的程序来解析可用的插件信息,然后在运行时根据特定的插件信息创建特定的实例吗?如果能得到相关步骤的代码大纲就太好了

如果我理解正确,您正在寻找一种方法来动态创建多个插件实例,可能是同一个插件的实例

您需要声明该类型的导入,然后根据元数据选择正确的工厂
ExportFactory.CreateExport
将负责
IPlugin
实例所需的任何导入,如您提到的
IPluginHost


请注意,
ExportFactory
仅出现在早期版本的silverlight版MEF中。要在桌面版中获得它,您当前需要(MEF 2-Preview 1)的最新版本。通过构造函数导入
ExportFactory也存在已知问题,因此请使用属性。

您创建了CompositionContainer吗?您可以使用它来请求特定的插件类型并将其实例化。目录会帮你找到一部分。您可以聚合多个目录(使用AggregateCatalog),然后将结果传递给CompositionContainer的构造函数。当您请求特定的IPlugin类型时(只需跟踪导出的类型),您可以要求CompositionContainer为您实例化插件,它会自动为您执行构造函数注入。

您是否成功使用MEF 2 Preview 1,我与.NET 4.0 System.Components.Composition one发生程序集冲突!ExportFactory就是我想要的!对不起,迟了答复。如前所述,我能够解决出口工厂的问题。但是使用.NET3.5。