2014-01-20 43 views
3

我有一個奇怪的MEF問題的部分,我在一個測試項目測試這一點,這一切似乎工作得很好,但由於某種原因,在實際的項目GetExportedValues <MyType>返回任何內容,我可以看到

這不工作是出口代碼

public void RegisterComponents() 
    { 

     _registrationBuilder = new RegistrationBuilder(); 
     _registrationBuilder 
      .ForTypesDerivedFrom(typeof(MyType)) 
      .SetCreationPolicy(CreationPolicy.NonShared) 
      .Export(); 

     var catalog = new AggregateCatalog(); 
     catalog.Catalogs.Add(new AssemblyCatalog(typeof(MyType).Assembly, _registrationBuilder)); 


     var directoryCatalog = new DirectoryCatalog(PathToMyTypeDerived, _registrationBuilder); 
     catalog.Catalogs.Add(directoryCatalog); 

     _compositionContainer = new CompositionContainer(catalog); 
     _compositionContainer.ComposeParts(); 

     var exports = _compositionContainer.GetExportedValues<MyType>(); 
     Console.WriteLine("{0} exports in AppDomain {1}", exports.Count(), AppDomain.CurrentDomain.FriendlyName); 
    } 

出口計數爲0 :(任何想法,爲什麼?

在日誌文件中我有很多這樣

SY的stem.ComponentModel.Composition信息:6:ComposablePartDefinition'SomeOthertype'被忽略,因爲它不包含導出。

雖然我認爲這是可以的,因爲我沒」興趣出口‘someOtherType’

更新:我發現這個link但調試運行在它之後,我並不聰明,但也許我不是適當跟進。

感謝任何指針

乾杯

+0

什麼是CorePlugin?它是否來自MyType? –

+0

它是MyType,我將編輯代碼(我改變了名稱,使問題更加明顯) – roundcrisis

+0

順便說一句,如果我用Roslyn構建,這是第二次拾取,但我不能不斷更改編譯器:D – roundcrisis

回答

3

我只是有同樣的問題,this article幫了我很多。

它描述瞭解決方案可能會失敗的不同原因。其中一個比較重要的問題是,您要解析的類型的依賴關係的依賴性未被註冊。

什麼幫助了我很多,當你調試你的應用程序時,跟蹤輸出被寫入輸出窗口。它準確地描述了爲什麼類型無法解決的原因。

即使有這個輸出。你可能需要挖一點點,因爲我只有一個深度。

例子:

我想解決型,我得到了這樣的消息:

System.ComponentModel.Composition警告:1:ComposablePartDefinition 'Namespace.A' 已被拒絕。組成保持不變。由於以下錯誤,更改被拒絕:組合產生了多個組合錯誤,其中有1個根本原因。根源在下面提供。查看CompositionException.Errors屬性以獲取更多詳細信息。

1)出口沒有發現匹配的約束: ContractName Namespace.IB RequiredTypeIdentity Namespace.IB

,導致:無法設置進口「Namespace.A..ctor(參數= 「B」,ContractName =「namespace.IB」)'部分'命名空間A'。 Element:Namespace.A..ctor(Parameter =「b」,ContractName =「Namespace.IB」) - > Namespace.A - > AssemblyCatalog(Assembly =「assembly,Version = 0.0.0.0,Culture = neutral, PublicKeyToken = ...「)

但我清楚地看到了一個部分爲Namespace.IB。所以,在調試器中,我試圖解決這個問題。我得到了另一個跟蹤輸出。這一次它告訴我,我的執行Namespace.IB無法解決,因爲它的一個導入有一個缺失的導出,所以基本上和上面的消息一樣,只是具有不同的類型。而這一次,我沒有找到缺少進口的一部分。現在我知道,哪種類型是真正的問題,並且弄清楚爲什麼沒有註冊。

相關問題