我正在使用.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; }
我认为丹尼尔的回答是被接受的,因为以更彻底的方式调试的圣人建议解决了这个问题。
答案 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;
}