我可以重新创建CompositionContainer吗?

时间:2013-09-11 12:22:16

标签: wpf mef

我在显示主窗口之前有一个带登录窗口的wpf应用程序。

我使用mef加载所有模块/部件。在主窗口开始之前,我会根据我显示的部分检查用户登录数据。部分是共享和非共享。

[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并创建一个新的?

2 个答案:

答案 0 :(得分:0)

您可以尝试拨打_mefcontainer.RemovePart(somepartwithaSharedExport)。更多详情:http://mef.codeplex.com/wikipage?title=Parts%20Lifetime

答案 1 :(得分:0)

对于非共享部分,您可以拨打CompositionContainer.ReleaseExport

_mefcontainer.ReleaseExport(nonSharedExport);

有关详细信息,请尝试使用此answer中的示例代码。

据我所知,如果不配置容器,则无法释放共享部件。如果您使用该路径,那么您还必须确保不保留对这些对象的引用以允许 GC 收集它们。来自mrtig的答案的文档参考提供了许多关于部件寿命的有用细节,你应该将它与weshaggard的answer一起研究到类似的问题。它还解释了一次性部件会发生什么。