2012-02-19 41 views
1

我有一个简单的控制台应用程序如以下的(未相关的代码为简单起见移除)MEF和AssemblyCatalog/AggregateCatalog

[ImportMany(typeof(ILogger))] 
    public IEnumerable<ILogger> _loggers {get;set;} 

    public interface ILogger 
    { 
     void Write(string message); 
    } 

    [Export(typeof(ILogger))] 
    public class ConsoleLogger : ILogger 
    { 
     public void Write(string message) 
     { 
      Console.WriteLine(message); 
     } 
    } 

    [Export(typeof(ILogger))] 
    public class DebugLogger : ILogger 
    { 
     public void Write(string message) 
     { 
      Debug.Print(message); 
     } 
    } 

的代码初始化目录低于

(1) var catalog = new AggregateCatalog(); 
(2) catalog.Catalogs.Add(new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory)); 
(3) //var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()); 

var container = new CompositionContainer(catalog); 
var batch = new CompositionBatch(); 
batch.AddPart(this); 
container.Compose(batch); 

如果目录如果目录是通过第3行初始化的,两个记录器都被加载到_logger中

什么是“ AggregateCatalog方法的问题是什么?

谢谢

回答

0

我发现问题。

看来DirectoryCatalog(路径)默认只在DLL中搜索,而我的测试程序是一个控制台应用程序。出口是在EXE(不是DLL),所以他们没有加载。另一方面,AssemblyCatalog(Assembly.GetExecutingAssembly())明显加载了当前程序集(这是EXE)的导出。

解决方法是使用DirectoryCatalog(path,searchPattern)的其他构造函数,并使用“*。*”作为第二个参数。它的工作原理

0

它应该按照您使用它的方式工作。

但是,在第2行中,您将创建一个DirectoryCatalog,并在第3行中创建一个AssemblyCatalog。如果您将第二行更改为

catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly())); 
+0

谢谢。但我期望线DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory)添加到应用程序的bin文件夹中的所有DLL的目录导出(这是我真正想要的某个点)。与AssemblyCatalog不同,它只是增加当前Assembly的输出。如何查找所有DLL中的导出? – bzamfir 2012-02-19 20:04:28