【问题标题】:Adding assemblies to catalog using MEF使用 MEF 将程序集添加到目录
【发布时间】:2012-03-11 12:30:40
【问题描述】:

有一个相当大的项目,其中向 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 部件的配置文件中定义了一些程序集,而在项目中引用的其他程序集也包含 MEF 部件。您正在尝试为您的 CompositionContainer 构建一个目录,以便包含来自两个来源的所有部分。目前,某些零件不会在您的目录中结束。您是否需要在多个组件中寻找零件?
  • addAssembly 方法究竟做了什么?能发一下代码吗?
  • 我正在尝试将在设计时引用的目录添加到目录中,而无需在代码中明确添加它们,然后根据配置文件添加其他部分并使用字典来避免重复我遇到的问题回来用了几天调试!!

标签: c# .net wpf prism mef


【解决方案1】:

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

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

【讨论】:

    【解决方案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 中,因此它会得到这些。其余的程序集将被复制到部件目录中。

    【讨论】:

    • 这当然可行,但我不能使用 DirectoryCatalog,这就是我在代码中使用字典以避免重复的原因之一
    • 为什么不能使用DirectoryCatalog
    • @jberger 长篇大论,但简而言之,部件和版本是集中管理的,这就是为什么
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-21
    • 2014-11-16
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多