5

我第一次在 Visual Studio 2010 beta 2 中使用 .net-4.0 中的 System.ComponentModel.Composition 试用托管可扩展性框架。

我一直无法让 CompositionContainer 使用下面的两个替代例程找到我的实现程序集。

第一次尝试(这在 MEF 的旧 codeplex 版本中有效):

var composition = new CompositionBatch();
composition.AddPart(this);
var container = new CompositionContainer(new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory));
container.Compose(composition);

第二次尝试(我认为这在 beta 1 中有效):

var aggregateCatalog = new AggregateCatalog(
    new AssemblyCatalog(Assembly.GetExecutingAssembly()),
    new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory));
var compositionContainer = new CompositionContainer(aggregateCatalog);
compositionContainer.ComposeParts(this);

在 beta 2 中是否有新的方法可以做到这一点?

编辑:原来这与作文无关。我有一个代表我导入的实现的静态属性:

[Import] public static ILog Log { get; set; }

应该是:

[Import] public ILog Log { get; set; }

我将丹尼尔的答案标记为已接受,因为以更彻底的方式进行调试的明智建议解决了问题。

4

2 回答 2

1

什么是失败?是否存在您期望满足但不满足的导入?您是否正在调用 GetExports() 并且它失败了?

您可以在创建目录后中断调试器,并将鼠标悬停在 aggregateCatalog 变量上以检查它并查看其中包含哪些部分。我的猜测是这些部件可能在目录中,而问题出在代码中的其他地方。一个可能的原因是您有一个使用 [Import] 属性而不是 [ImportMany] 的集合导入,和/或您的部件被拒绝,因为它们具有无法满足的导入。

于 2009-11-17T16:20:33.630 回答
0

我看一下SoapBox Core Host中的 Compose 方法,您可以使用 DirectoryCatalog 来查找目录中的所有部分。但是,这不是针对 .NET 4 编译的,只是针对 MEF 的预览版:

    private bool Compose()
    {
        var catalog = new AggregateCatalog();
        catalog.Catalogs.Add(new DirectoryCatalog("."));

        _container = new CompositionContainer(catalog);

        try
        {
            _container.ComposeParts(this);
        }
        catch (CompositionException compositionException)
        {
            MessageBox.Show(compositionException.ToString());
            return false;
        }
        return true;
    }
于 2009-11-18T01:14:09.537 回答