2010-03-26 38 views
7

在使用MEF時我缺少一些基本的東西。我使用示例和一個簡單的控制檯應用程序,其中的一切都在同一個程序集中。然後,我將一些進口和出口放在一個包含各種實體的單獨項目中。我想在MS Test中使用這些實體,但實際上從未完成組合。當我將合成內容移入有問題的實體的構造函數中時,它可以工作,但這顯然是錯誤的。 GetExecutingAssembly只是「看」測試過程嗎?我錯過了什麼容器?我試圖把容器放在測試中,但沒有運氣。 MEF文檔仍然非常少,我找不到一個應用程序(或MS測試)的簡單示例,它使用來自不同項目的實體...MEF在其他程序集中找不到零件

回答

9

在.NET中,每個exe或DLL文件都稱爲程序集。因此,當您基於「正在執行的程序集」構建目錄並在應用程序入口點使用該目錄時,則只包含在exe項目中定義的部分。您不會在DLL中定義任何部分。

嘗試更換此:

var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()); 

本:

var catalog = new AggregateCatalog(
    new ComposablePartCatalog[] 
    { 
     new AssemblyCatalog(Assembly.GetExecutingAssembly()), 
     new DirectoryCatalog(".") 
    }); 

編輯:我剛剛發現,有一個簡單的解決方案:

var catalog = new DirectoryCatalog(".", "*"); 

( )其實,程序集可以由多個文件組成,但很少使用。該術語也用於並排COM。

3

是的。您需要確保在合成之前將您的裝配(具有導入和導出的裝配)添加到目錄。這樣,它可以找到適當的部分。

GetExecutingAssembly正是它所說的 - 它獲取當前正在執行的程序集,這意味着具有該特定代碼的程序集。在你的情況下,這是測試程序集,而不是你的「庫」項目。

您的測試是否明確將庫項目添加到目錄中,並且它很可能會按照您的預期工作。