2014-10-09 48 views
1

在撰寫或使用ExportProvider.GetExportedValues方法時。拋出異常CompositionContractMismatchException。例如,我轉換遺留的代碼與靜態工廠,所以我只是想公開那裏返回值到MEF容器。MEF拋出CompositionContractMismatchException

namespace fooProject 
{ 
    static class SomeExportFactory 
    { 
     [Export(typeof(IFoo))] 
     public static FooImp Generate() 
     { 
      return new FooImp(); 
     } 
    } 
} 

所以,這個簡單的例子將拋出異常與此消息「不能投類型的內在導出值‘fooProject.SomeExportFactory.Generate(ContractName =‘的IFoo’)’輸入‘的IFoo’」。鍵入「IFoo」。]。

任何猜測什麼可能導致這種情況?我已經搜索了互聯網,CompositionContractMismatchException when trying to use MEF with MVC controller是我可以找到的關閉的東西,但我沒有像那樣的情況下重複的程序集。

回答

2

好的,我找到了答案。不要從靜態函數中導出!!!希望這可以幫助其他人在這種情況下。

如果您嘗試從靜態函數中導出,MEF將拋出一個模糊的異常。異常看起來像一個潛在的重複程序集加載。就像一些答案提示的那樣,但唉。

對於對更多細節感興趣的人可以閱讀(提供了當前MEF實現的鏈接)。代碼在ContractServices.cs處剎車。你會在那裏找到一個公共靜態函數「TryCast」。它爲MEF提供了一個機制來提供裝箱到指定類型的對象的實例。但它只檢查2個條件。首先,傳入的對象已經是所需的類型。其次,通過ExportedDelegate提供對象(可能的成員函數Export的工作原理)。如果您的導出不符合其中的任何一個,則返回false,並立即引發CompositionContractMismatchException(請參閱ExportServices.cs T CastExportedValue(ICompositionElement元素,object exportedValue)函數)。

我希望他們會在這種情況下拋出DummyDontUseStaticException:p