指示MEF使用任何可用的组件

时间:2009-11-17 14:07:05

标签: c# visual-studio-2010 .net-4.0 mef

我正在使用.net-4.0中的System.ComponentModel.Composition在Visual Studio 2010 beta 2中首次尝试Managed Extensibility Framework。

我无法使用下面两个替代例程让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);

在测试版2中是否有新方法可以做到这一点?

编辑:事实证明这与作曲无关。我有一个静态属性代表我导入的实现:

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

应该是:

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

我认为丹尼尔的回答是被接受的,因为以更彻底的方式调试的圣人建议解决了这个问题。

2 个答案:

答案 0 :(得分:1)

什么失败了?是否存在您希望满足的进口不满意?你在调用GetExports()并且它失败了吗?

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

答案 1 :(得分: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;
    }