0

我正在尝试在 .NET 4 中创建一个可扩展的“实用程序”控制台应用程序,并且我认为使用 MEF 来执行此操作会在灵活性和可扩展性方面给我最好的。

于是我开始设置MEF接口:

public interface IUtility
{
    string Title { get; }
    string Version { get; }

    void Execute(UtilContext context);
}

然后我创建了两个几乎相同的测试插件——只是为了看看这些东西是如何工作的:

MEF 插件:

[Export(typeof(IUtility))]
public class Utility1 : IUtility
{
    public string Title
    {
        get { return "Utility 1"; }
    }

    public string Version
    {
        get { return "1.0.0.0"; }
    }

    public void Execute(UtilContext context)
    {
    }
}

充当 MEF 插件“主机”的控制台应用程序如下所示:

[ImportMany]
public IEnumerable<IUtility> _utilities { get; set; }

public void SetupMEF()
{ 
   string directory = ConfigurationManager.AppSettings["Path"];

   AggregateCatalog catalog = new AggregateCatalog();
   catalog.Catalogs.Add(new DirectoryCatalog(directory));

   CompositionContainer container = new CompositionContainer(catalog);
   container.ComposeParts(this);
}

我检查了 - 正在正确读取目录app.config,并且在构建解决方案后插件模块(* .dll 文件)存在于那里。一切似乎都很好......直到我得到这个例外:

System.Reflection.ReflectionTypeLoadException 未处理
消息 = 无法加载一种或多种请求的类型。检索 LoaderExceptions 属性以获取更多信息。

LoaderException:
来自程序集 'Utility1,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null' 的类型 'Utility.Utility1' 中的方法 'get_Version' 没有实现

嗯.... MEF 到底想在这里告诉我什么?我该如何解决这个问题?任何想法,想法,指针?

我是否通过拥有一个名为Version我自己的属性而打破了某些约定?这是MEF保留的东西吗?

4

1 回答 1

2

对不起,伙计们-我的错。在“插件”目录中有一个非常旧的 *.dll 徘徊,确实没有该属性Get方法的任何实现。

清除那个 pre-alpha ;-) *.dll 解决了我的问题。我现在确实可以加载我的插件,并且它们可以有一个Version没有任何问题的属性。

于 2012-06-03T12:39:55.060 回答