メインウィンドウを表示する前に、ログインウィンドウを備えた 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 をクリーンアップして新しいものを作成する方法はありますか?