2016-04-21 61 views
2

我在我的溶液3個項目:MEF容器不能從共享裝配組成份

1- ExporterLib(類庫)

2- ImporterApp(WPF應用程序)

3- SharedLib(類庫)

前兩個項目引用了「SharedLib」,其中包含一個名爲ISharedClass的接口。

內部 「ImporterApp」 我有一個名爲ClassA類:

public class ClassA 
{ 
    [Import] private ISharedClass part; 
} 

內部 「ExporterLib」 我有一個叫SharedClassExport類:

[Export(ISharedClass)] 
public class SharedClassExport : ISharedClass 
{ 
    //.... 
} 

在ImporterApp我使用DirectoryCatalog引用ExporterLib.dll文件和容器。但是,當我嘗試使用容器組成ClassA的實例的部分我收到一個異常說:

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

當我使用調試器查看目錄中的零件時,我看到正確的SharedClassExport零件,但它沒有引用ISharedClass!

我該怎麼辦?

P.S. :我想使用MEF,我不想將這些項目合併在一起。

在此先感謝。


摘要:

//指定合同類型可以是重要的,如果 要導出之外的類型,則基本類型, 如接口。

https://msdn.microsoft.com/en-us/library/system.componentmodel.composition.importattribute(v=vs.110).aspx

回答

2

請嘗試使用[導出(typeof運算(ISharedClass))。如果要導出除基本類型之外的類型(如接口),則使用typeof指定完整的合同類型非常重要。要匹配導出使用[導入(typeof(ISharedClass))]。請讓我知道如果不工作,請提供您正在使用的DirectoryCatalog組合邏輯?

+0

單獨添加[導出(typeof(ISharedClass))]不起作用。但是當我將簡單的[Import]屬性更改爲[Import(typeof(ISharedClass))]時,它被神奇地解決了。你能描述一下如果我沒有明確說明我正在使用的導入類型會發生什麼?謝謝你的方式。 –

+0

我很高興我能解決這個問題。如果您仔細查看我的回覆,我確實提到您必須將導入與[導入(typeof(ISharedClass))]相匹配。這是因爲你沒有導出簡單的類型。您的類型從ISharedClass繼承,MEF需要知道正確導出類型的完整合同。 –

+0

那麼我最初的意思是說,爲什麼MEF只是在零件的類型與出口匹配時才能找出它本身......但是我看了這篇文章後發現「如果你指定合同名稱可能很重要想要導出除接口之外的基本類型以外的類型「... https://msdn.microsoft.com/en-us/library/system.componentmodel.composition.importattribute(v=vs.110).aspx –

0

生成後檢查ImporterApp的bin文件夾。我願意下注ExporterLib.dll不在文件夾中。由於ExporterLib.dll不是ImporterApp的直接依賴關係,因此MSBuild不會將其複製到構建時的ImporterApp的bin文件夾中。要解決這個問題,您有幾個選擇:

  • 您可以在ImporterApp項目中添加對ExporterLib的引用。
  • 如果您不想添加引用,那麼ImporterApp上的後期構建步驟將ExporterLib.dll複製到ImporterApp的bin目錄也可以。
  • 您也可以設置每個項目以構建到解決方案結構中的同一個目錄。
+0

I手動將ExporterLib.dll複製到ImporterApp的bin目錄中,正如你所說的那樣......然而Soma的方法解決了這個問題。感謝您的關注。 –