1

在显示主窗口之前,我有一个带有登录窗口的 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 异常。

这就是为什么我现在使用这种方法

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

我对此不满意。

有没有办法清理 Compositioncontainer 并创建一个新的?

4

2 回答 2

0

你可以试着打电话_mefcontainer.RemovePart(somepartwithaSharedExport)。更多细节在这里: http://mef.codeplex.com/wikipage?title= Parts%20Lifetime

于 2013-09-12T15:45:44.387 回答
0

对于非共享部分,您可以调用CompositionContainer.ReleaseExport

_mefcontainer.ReleaseExport(nonSharedExport);

有关更多信息,请尝试此答案中的示例代码。

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

于 2013-10-15T10:24:40.413 回答