2010-08-06 76 views
1

我已經創建了一個MEF插件控件,可以導入到我的應用程序中。現在,我希望插件能夠從應用中導入零件。我無法確定如何在插件中設置目錄,以便它可以從應用程序中找到導出。有人可以告訴我這是怎麼完成的?下面是我的代碼,當我嘗試用當前正在執行的程序集創建AssemblyCatalog時,它不起作用。MEF:如何從導出的對象導入?

[Export(typeof(IPluginControl))] 
public partial class MyPluginControl : UserControl, IPluginControl 

    [Import] 
    public string Message { get; set; } 


    public MyPluginControl() 
    { 
     InitializeComponent(); 
     Initialize(); 
    } 

    private void Initialize() 
    { 
     AggregateCatalog catalog = new AggregateCatalog(); 
     catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly())); 
     CompositionContainer container = new CompositionContainer(catalog); 
     try 
     { 
      container.ComposeParts(this); 
     } 
     catch (CompositionException ex) 
     { 
      Console.WriteLine(ex.ToString()); 
     } 

    } 
} 

回答

2

你不需要這樣做。

只需確保您使用的目錄導入此插件包含主應用程序的程序集。當你的MEF構造你的類型爲了導出它(爲了完成在其他地方導入IPluginControl),它已經爲你編寫了這個部分 - 並且在那一點上,將導入「消息」字符串(儘管你最可能應該爲該「消息」或某種自定義類型指定一個名稱 - 否則,它只會導入一個字符串,並且只能在應用程序的任何位置使用一個「字符串」導出)。

當MEF組成部分,它找到所有類型匹配指定類型(在這種情況下IPluginControl),實例化一個對象,填補了該對象的任何[Import]要求(這就是爲什麼你不需要在撰寫這個你構造函數),然後將其分配給任何導入該類型的對象。

+0

謝謝,你說的一切都有幫助,它現在可行! – 2010-08-06 16:51:57