2012-02-28 35 views
0

我創建了console c#項目。並在代碼中創建了一個模塊。我的代碼看起來像這樣。如何通過設置路徑獲取插件

[Import] 
public IMessageSender MessageSender { get; set; } 

public static void Main(string[] args) 
{ 
    Program p = new Program(); 
    p.Run(); 
} 

public void Run() 
{ 
    Compose(); 
    Console.ReadLine(MessageSender.Send("Message Sent")); 
} 

private void Compose() 
{ 
    AssemblyCatalog catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()); 
    var container = new CompositionContainer(catalog); 
    container.ComposeParts(this); 
} 

public interface IMessageSender 
{ 
    string Send(string message); 
} 

[Export(typeof(IMessageSender))] 
public class EmailSender : IMessageSender 
{ 
    public void Send(string message) 
    { 
     return message; 
    } 
} 

它工作得很好。但現在我在溶液一個新的項目,並在主控制檯程序我改變了我的一些代碼,添加模塊成 AnotherProject-> EmailSender.cs

[Export(typeof(IMessageSender))] 
public class EmailSender : IMessageSender 
{ 
    public void Send(string message) 
    { 
     return message; 
    } 
} 

現在。

private void Compose() 
{ 
    var catalog = new DirectoryCatalog(path); 
    //AssemblyCatalog catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()); 
    var container = new CompositionContainer(catalog); 
    container.ComposeParts(this); 
} 

但現在當我運行這個程序。它不加載模塊。主程序中的MessageSender爲null。我做了什麼錯事。

回答

0

有你需要檢查的幾件事情:

  1. 你有正確引用的程序集?
  2. 默認情況下,DirectoryCatalog使用搜索模式*.dll。由於您有一個使用.exe擴展名的控制檯應用程序,因此該程序集中的導出將不會被DirectoryCatalog獲取 - 具有默認搜索模式。您可能需要使用AggregateCatalog,傳入DirectoryCatalog*.dll),以及輸入程序集的另一個DirectoryCatalog*.exe)或AssemblyCatalog
  3. 您目前有一[Import],你可以用多個[Export(typeof(IMessageSender))]結束了,你沒有說明你已經移動EmailSender的類庫,只是說你已經創建了一個新的一個,這意味着你」如果希望進口爲正數,則可能最終出現基數不匹配,因此您有很多出口。這將明確地拋出一個異常,即使它找不到IMessageSender的單個實例也會發生這種情況,因爲您的[Import]屬性未設置爲允許默認值,其中不提供任何部分。如果你需要故障tollerant,您可以使用[Import(AllowDefault = true)]

順便......上面的代碼將無法編譯,我認爲這只是一個例子,而不是從當前的代碼複製粘貼?

public void SendMessage(string message) 
{ 
    return message; 
} 

你重新調諧消息到void方法 - 不能完成,這也意味着EmailSender不正確地實現IMessageSender。不要太困擾,因爲我認爲這是一個比實際代碼更多的例子。

+0

一切都正確完成,在插件中的無效是一個打字錯誤。它是字符串。而且我不是ImportMany,因爲我知道我只有一個模塊用於這個應用程序。我想我需要在目錄編目中添加* .dll。可能會有效。 – 2012-02-29 05:36:55

相關問題