MEF导入不适用于外部装配

时间:2015-10-07 08:30:50

标签: c# .net mef

我有以下MEF测试代码:

[Import(AllowDefault = true)]
string importedString; 

[Import(typeof(IString), AllowDefault = true)]
public IString importedClass;

private void Import(bool fromDll)
{
    CompositionContainer MyContainer;
     if (fromDll)
    {
        DirectoryCatalog MyCatalog = new DirectoryCatalog("D:\\Source\\ClassLibrary\\bin\\Debug\\", "ClassLibrary.dll");
        MyContainer = new CompositionContainer(MyCatalog);
    }
    else
    {
        AssemblyCatalog MyCatalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
        MyContainer = new CompositionContainer(MyCatalog);
    }
    MyContainer.SatisfyImportsOnce(this);

    MessageBox.Show(importedString == null ? "String not found" : importedString, "fromDLL=" + fromDll.ToString());
    MessageBox.Show(importedClass == null ? "Class not found" : importedClass.getClassMessage(), "fromDLL=" + fromDll.ToString());
}

导出部分在同一文件中定义如下:

public class MyString
{
    [Export()]
    public string message = "This string is imported";
}

public interface IString
{
    string getClassMessage();
}

[Export(typeof(IString))]
public class MyClass : IString
{
    public string getClassMessage()
    {
        return ("This class is imported");
    }
}

现在,如果我调用Import(false),每件事都可以正常工作,我会得到两个带有“此字符串已导入”和“此类已导入”的文本的消息框

但是,如果我创建ClassLibrary.dll(其命名空间中只有导出的部分)并调用Import(true),我会得到“此字符串已导入”消息框但我得到“未找到类”信息。 行为不同的原因是什么?我做错了吗?

1 个答案:

答案 0 :(得分:2)

为了完成起见,我会发布答案。

使用MEF时,您需要注意使用完全相同的类型,即同一组件中的相同类型。这就是为什么MEF作为插件系统并不真正有用的原因,因为每次重建包含接口的程序集时,都需要重建每个插件。

当然有可能这样做,例如使用Managed AddIn Framework。有关这两者的更多信息,请参阅此帖子:Choosing between MEF and MAF (System.AddIn)