使用来自另一个MEF程序集的类而不引用它

我有2个MEF组件。 让它成为组件A和组件B.

我需要的是能够从组件A中的组件B访问类而不参考它。 然后我想手动实例化该类的对象。

目前我看到MEF允许使用[Import]自动实例化对象。 它使用需要引用的接口。

我可以使用其他程序集中的数据类型而不引用它吗? MEF是否支持这种机制?

有几种方法可以做到这一点。

首先,您需要定义两个程序集都能理解的公共接口。 这可能是这两个程序集引用的“PublicInterfaces”库,也可能是程序集A内部(B引用A,但不是相反)。

在B中,使用此接口导出类型。

B必须在容器的目录中。 在AssemblyCatalog显式引用程序集B,或者创建DirectoryCatalog并将其指向将包含程序集B的目录。

在A中,代替使用Import属性,在代码中调用容器上的GetExportedValue() 。 代码看起来像这样:

 // Known by A and B public interface CommonInterface { // ... } // In B, not A [Export(typeof(CommonInterface))] public class BClass : CommonInterface { // ... } // In A where you want to manually create class B CommonInterface objB = _container.GetExportedValue(); 

您可以通过reflection实例化一个类,而无需对文件进行硬引用。 你不需要MEF。

然后我想手动实例化该类的对象。

也许您最好通过加载程序集并从中选择所需类型而不是使用MEF来手动完成。