2009-11-17 4 views
5

.NET Framework 4.0のSystem.ComponentModel.Compositionを使用して、Visual Studio 2010ベータ2でManaged Extensibility Frameworkをはじめて試しています。使用可能なアセンブリを使用するようにMEFに指示します

以下の2つの代替ルーチンを使用して、実装アセンブリを見つけるためにCompositionContainerを取得できませんでした。

最初の試み(これはMEFの古いCodePlexのリリースで働いていた):

var composition = new CompositionBatch(); 
composition.AddPart(this); 
var container = new CompositionContainer(new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory)); 
container.Compose(composition); 

第二の試み(これはベータ1で働いていた、私は思う):

var aggregateCatalog = new AggregateCatalog(
    new AssemblyCatalog(Assembly.GetExecutingAssembly()), 
    new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory)); 
var compositionContainer = new CompositionContainer(aggregateCatalog); 
compositionContainer.ComposeParts(this); 

は、新しい方法がありますベータ2でこれを行うには?

編集:これは構成とは関係がないことが判明しました。

されている必要があります
[Import] public static ILog Log { get; set; } 

:私は私のインポート実装表す静的プロパティました

[Import] public ILog Log { get; set; } 

を受け入れたように、より徹底したファッションでのデバッグの賢者の助言が問題を解決したので、私はダニエルの答えをマーク。

+0

私は数週間前からベータ2を使用していましたが、問題なく2番目の例を使用しています。実行中のアセンブリに内部部品がありますか、それともBaseDirectoryに配置されていますか? AppDomain.CurrentDomain.BaseDirectoryが実行時にマップするものを確認できましたか?また、上記のスニペットを含むクラスには宣言されたImportsが含まれていますか?クラスのインスタンス(これ)にインポートがない場合は何も選択されないので、確実に確認してください – JamesEggers

+0

私は何かダフットをしているに違いありません。私はそれを働かせようとしている間、実装は簡単です。 BaseDirectoryは有効で、クラスにはインポートがあります。それでも、もう少し頭を悩ませて、私は最後にそこに着くでしょう。 – grenade

+0

静的なプロパティに[インポート]を使用できない理由を誰でも説明できますか? – Dave

答えて

1

何が失敗していますか?あなたが満足していると期待される輸入品はありますか?満足していませんか? GetExports()を呼び出していて、失敗していますか?

カタログが作成された後にデバッガを起動し、aggregateCatalog変数の上にマウスを置いて調べると、その中の部品が表示されます。私の推測では、部品はおそらくカタログにあり、問題はあなたのコードのどこかにあります。おそらく、[ImportMany]の代わりに[Import]属性を使用しているコレクションのインポートがあるか、または満たすことができないインポートがあるためにパーツが拒否されている可能性があります。

0

SoapBox Core HostのComposeメソッドを見てみると、DirectoryCatalogを使ってディレクトリ内のすべての部分を見つけることができます。しかし、これはMEFのプレビュー版に対して.NET 4に対してコンパイルされたものではありません。

private bool Compose() 
    { 
     var catalog = new AggregateCatalog(); 
     catalog.Catalogs.Add(new DirectoryCatalog(".")); 

     _container = new CompositionContainer(catalog); 

     try 
     { 
      _container.ComposeParts(this); 
     } 
     catch (CompositionException compositionException) 
     { 
      MessageBox.Show(compositionException.ToString()); 
      return false; 
     } 
     return true; 
    }