2012-02-28 11 views
0

コンソール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によって取得されません。 DirectoryCatalog*.dll)と入り口アセンブリの別のDirectoryCatalog*.exe)、またはAssemblyCatalogを渡して、AggregateCatalogを使用することをお勧めします。
  3. あなたは現在、あなたが複数の[Export(typeof(IMessageSender))]で終わることができる1つ[Import]は、あなたが「あなたを意味し、新しい 1を作成しただけであること、あなたはは、クラスライブラリにEmailSenderを移動したことを述べるなかった持っていますシンプルなインポートを期待しているところでカーディナリティの不一致が生じる可能性があります。多くの輸出があります。これにより、明示的に例外がスローされます。これは、IMessageSenderという単一のインスタンスが見つからない場合でも、[Import]属性は、パートを提供できないデフォルト値を許可するように設定されていないためです。あなたが障害tollerantをする必要がある場合は、あなたが[Import(AllowDefault = true)]

は、上記のコードはコンパイルされません...ちなみに使用することができ、私はそれはあなたの現在のコードからのコピー&ペーストだけで例としなかったと仮定しますか?

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

あなたはvoidメソッドにメッセージを再同調している - に行うことができない、それはまた、EmailSenderが正しくIMessageSenderを実装していないことを意味します。私はそれが実際のコード以上の例だと思うので、あまりにも煩わされません。

+0

すべてが正しく行われていますが、プラグインのその無効は入力ミスです。それは文字列です。私はImportManyをやっていません。なぜなら、私はこのアプリケーション用に1つのモジュールしか持たないことを知っているからです。ディレクトリカタログに* .dllを追加する必要があると思います。それはうまくいくかもしれません。 –

関連する問題