1

メインウィンドウを表示する前に、ログインウィンドウを備えた wpf アプリケーションがあります。

mef を使用してすべてのモジュール/パーツをロードします。メインウィンドウが起動する前に、ユーザーのログインデータを表示する部分と照合します。Shared と NonShared の部分。

[ImportMany]
private IEnumerable<Lazy<IComponent, IComponentMetadata>> _components;

[ImportMany("Resourcen", typeof(ResourceDictionary))]
private IEnumerable<ResourceDictionary> _importResourcen;

var catalog = new AggregateCatalog();
catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
catalog.Catalogs.Add(new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory));
_mefcontainer = new CompositionContainer(catalog);

_mefcontainer.ComposeParts(somepartwithaSharedExport, this);

これはすべてうまくいきます。しかし今、私は「再ログイン」を試みました。

 _mefcontainer.Dispose();
 _mefcontainer = null;

 //here the stuff that works from above

最初はうまくいくと思いましたが、最初に作成したパーツがまだメモリに存在しているようで、それらを「殺す」機会がありません。そのため、十分な回数再ログインすると OutOfMemory Exception が発生しました。

そのため、私は今このアプローチを使用しています

  System.Diagnostics.Process.Start(Application.ResourceAssembly.Location);
  App.ShutDown();

私はこれに満足していません。

Compositioncontainer をクリーンアップして新しいものを作成する方法はありますか?

4

2 に答える 2

0

非共有部分については、CompositionContainer.ReleaseExportを呼び出すことができます。

_mefcontainer.ReleaseExport(nonSharedExport);

詳細については、この回答のサンプル コードを試してください。

私の知る限り、コンテナーを破棄しないと共有パーツを解放することはできません。そのパスを使用する場合は、 GCがそれらを収集できるように、これらのオブジェクトへの参照が保持されていないことも確認する必要があります。mrtig の回答からのドキュメント参照は、部品の寿命に関する多くの有用な詳細を提供します。おそらく、同様の質問に対する weshaggardの回答とともにそれを検討する必要があります。また、使い捨て部品がどうなるかについても説明します。

于 2013-10-15T10:24:40.413 に答える
0

に電話してみてください_mefcontainer.RemovePart(somepartwithaSharedExport)。詳細はこちら: http://mef.codeplex.com/wikipage?title=Parts%20Lifetime

于 2013-09-12T15:45:44.387 に答える