使用MEF将程序集添加到目录

时间:2012-03-11 12:30:40

标签: c# .net wpf prism mef

有一个相当大的项目,其中有近十几个程序集添加到shell中,其他程序集通过config

添加

尝试找到更好的方法来添加项目中引用的程序集

到目前为止的代码看起来像这样

 Dictionary<string,string> dict = new Dictionary<string,string>(); // to avoid duplicate parts
 foreach (Assembly an in AppDomain.CurrentDomain.GetAssemblies())
            addAssembly(an, dict);

 foreach (AssemblyName an in Assembly.GetEntryAssembly().GetReferencedAssemblies())
            addAssembly(an, dict);

 foreach (AssemblyName an in GetAsmInConfig())
            addAssembly(an, dict);

即便如此,并非所有在设计时引用Shell的程序集都会添加到目录

想知道是否有任何不足以将所有程序集添加到配置中以实现技巧

更新

  void addAssembly(Assembly a, Dictionary<string, string> dict)
    {
        if (a.IsDynamic || dict.ContainsKey(a.FullName))
            return;

        dict.Add(a.FullName, a.FullName);
        AggregateCatalog.Catalogs.Add(new AssemblyCatalog(a));        
    }

2 个答案:

答案 0 :(得分:2)

根据我的理解,你试图在字典中获取所有程序集(来自appdomain,由条目程序集和配置文件引用),然后将其提供给MEF,以便它在这些程序集中查找部件。

我将为CompositionContainer提供AggregateCatalog,而不是使用它。然后我将创建DirectoryCatalogs并提供所述程序集(dll)所在的文件夹。

这些可能是项目的bin文件夹,它应该已经包含大多数dll,以及您需要的任何其他文件夹(当前在配置文件中指定的程序集所在的文件夹)。

更好的是,我会在bin文件夹中创建/ plugin或/ parts目录。使用post-build事件(在项目属性中),我会复制我所需的所有dll,这些dll不在我的bin文件夹中。然后我会做这样的事情:

var aggregateCatalog = new AggregateCatalog();

var mainDirectoryCatalog = new DirectoryCatalog(".");
var partsDirectoryCatalog = new DirectoryCatalog("./parts");

aggregateCatalog.Catalogs.Add(mainDirectoryCatalog);
aggregateCatalog.Catalogs.Add(partsDirectoryCatalog);

如果您将此aggregateCatalog提供给CompositionContainer,则将扫描这两个目录中的所有dll以查找部件。由于入口程序集及其引用的程序集已经在bin中,因此它将获得这些程序集。其余的程序集将复制到parts目录中。

答案 1 :(得分:2)

编译器将删除对实际未使用的引用,因此您不能将此作为枚举程序集的机制。 您的选择是:

  1. 使用配置文件
  2. 使用目录编目