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

本文关键字:添加 程序集 MEF 使用 | 更新日期: 2023-09-27 18:27:28

有一个相当大的项目,在shell中添加了近十几个程序集,并通过配置添加了其他程序集

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

到目前为止,代码看起来像这个

 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));        
    }

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

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

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

据我所知,您正试图在字典中获取所有程序集(来自appdomain,由条目程序集引用,并在配置文件中),然后将其提供给MEF,以便它在这些程序集中查找零件。

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

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

更好的是,我会在我的bin文件夹中创建一个/plugin或/parts目录。对于构建后的事件(在项目属性中),我会复制我需要的所有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中,因此它将获取这些程序集。其余的程序集将复制到零件目录中。