2012-03-11 54 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