2012-06-25 68 views
1

在此先感謝您的幫助。我有以下的出口部分:MEF組合.NET 4.0

[Export (typeof(INewComponent))] // orignally tried just [Export} here and importing NewComponent below 
public class NewComponent : INewComponent 
{ 
    // does stuff including an import 
} 

控制檯測試程序進口上述:

public class Program 
{  

    [Import] // have tried variations on importing "NewComponent NewComponent" etc 
    public INewComponent NewComponent 
    { 
     get; 
     set; 
    } 

    public static void Main(string[] args) 
    { 
     var p = new Program(); 
     var catalog = new AssemblyCatalog(typeof(Program).Assembly); 
     var container = new CompositionContainer(catalog); 
     container.ComposeParts(p); 
} 

的組成失敗,這些CompositionExceptions(我刪除,以保護犯罪:)命名空間):

1)未找到符合約束的有效導出 '((exportDefinition.ContractName ==「INewComponent」)AndAlso (exportDefinition .Metadata.ContainsKey(「ExportTypeIdentity」)AndAlso 「INewComponent」.Equals(exportDefinition.Metadata.get_Item(「ExportTypeIdentity」))))', 無效導出可能已被拒絕。

的組合工作方式成功,如果我做的組成在這樣的主程序:

public class Program 
{  

    public static void Main(string[] args) 
    { 
     INewComponent newComponent = new NewComponent(); 

     var catalog = new AssemblyCatalog(typeof(Program).Assembly); 
     var container = new CompositionContainer(catalog); 
     container.ComposeParts(newComponent); 
    } 
} 

謝謝

回答

3

是包含在同一個大會導出的一部分Program?如果是在一個單獨的DLL,您需要在您的目錄中大會爲好,像這樣:

var aggregateCatalog = new AggregateCatalog(); 
aggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(Program).Assembly)); 
aggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(NewComponent).Assembly)); 
var container = new CompositionContainer(aggregateCatalog); 
// etc... 

如果一個本不工作,那麼就叫做Visual MEFX一個很好的開源工具,它可以幫助你分析你的目錄。以下是有關設置它的短文:你寫了這個

Getting Started With Visual MEFx

+1

謝謝吉姆。是的,NewComponent是在一個DLL中,上面的技巧。我需要回去重新閱讀Block關於MEF的原始MSDN文章:)。在H2上的博客thx開始與Visual MEFX。完善。 –

2

在你NewComponent類:

// does stuff including an import 

如果有與未示出的進口問題,那麼MEF會抱怨Program.NewComponent導入,而不是實際的深層原因。這就是所謂的「穩定構圖」。 Stable composition can be useful,但是it also complicates the debugging of a failed composition

您可以按照關於Diagnosing Composition Errors的MEF文檔中的說明回到實際的原因。

在一個小程序中,您也可以嘗試撥打container.GetExportedValue<ISomeExport>()進行一些導出操作,直到找到導致問題的導出爲止。

+0

謝謝你Wim。是的,我熟悉穩定的作品:}。文章中關於SKU配置的想法非常有趣。 –