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

gre*_*ade 5 c# mef .net-4.0 visual-studio-2010

我正在使用.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);
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

[Import] public static ILog Log { get; set; }
Run Code Online (Sandbox Code Playgroud)

应该是:

[Import] public ILog Log { get; set; }
Run Code Online (Sandbox Code Playgroud)

我将Daniel的答案标记为已被接受,因为以更彻底的方式调试的sage建议解决了这个问题.

Dan*_*ted 1

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

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