2012-03-11 30 views
4

组件到目录有一个相当大的项目有近十几组件添加到外壳,并通过配置添加使用MEF

添加尝试其他组件,以找到更好的方法来添加项目引用程序

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

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

即使如此,在设计时参考壳牌所有组件添加到目录

想知道如果有什么事,总之将所有组件来配置,会做的伎俩

UPDATE

​​
+0

如果我理解正确的话,你必须在包含引用了MEF和其他部分配置文件定义了一些组件在一个也包含MEF零件的项目中。您正试图为您的CompositionContainer构建一个目录,以便包含来自两个来源的所有零件。目前有些零件不会结束在您的目录中。你需要在多个组件中寻找零件吗? – Gilles 2012-03-13 20:16:42

+1

addAssembly方法是做什么的?你能发布代码吗? – Gilles 2012-03-14 02:11:57

+0

为AddAssembly() – Kumar 2012-03-14 03:47:43

回答

2

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

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

从我明白你试图让所有组件(从应用程序域,通过进入组装和中引用的一个配置文件),然后将其提供给MEF,以便它在这些程序集中查找零件。

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

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

更妙的是,我会创造我的bin文件夹A /插件或/零件目录。随着后期生成事件(在项目属性)我想复制我需要它是不是已经在我的bin文件夹部分的所有DLL。然后,我会做这样的事情:

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中,它会得到它们。其余的部件将被复制到部件目录中。

+0

这当然是可行的,但我不能使用DirectoryCatalog,这就是为什么我有代码字典以避免重复的1个原因 – Kumar 2012-03-14 03:51:47

+2

为什么你不能使用'DirectoryCatalog'? – 2012-03-15 16:14:20

+0

@jberger长篇故事,但简而言之,部件和版本是集中管理的,这就是为什么 – Kumar 2012-03-15 19:28:56