请勿在配置MEF时调用部件处理

时间:2012-03-23 14:51:05

标签: c# containers mef dispose

当应用程序结束时遇到问题,容器没有调用部件的Dispose方法。 基于MEF的应用。

当我显式调用Dispose容器时,会在部件上调用matod Dispose,但是如果你只关闭程序,则不会调用部件的Dispose,为什么? 如何确保关闭程序时是由容器MEF的所有部分的Dispose方法引起的?

[Export(typeof(IMyClass))]
[PartCreationPolicy(CreationPolicy.Shared)]
public class MyClass: IDisposable, IMyClass
{
    private bool disposed = false;

    public void Dispose()
    {
        Dispose(true);

        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        if(!this.disposed)
        {
            if(disposing)
            {
                // Dispose managed resources.

            }

            disposed = true;
        }
    }

    ~MyClass()
    {
        Dispose(false);
    }
}

2 个答案:

答案 0 :(得分:2)

  

当我显式调用Dispose容器时,会在部件上调用matod Dispose,但如果你只关闭程序,则不会调用部件的Dispose,为什么?

因为必须在完成后处置容器。如果您的程序在退出之前没有调用CompositionContainer.Dispose(),那么这是程序中的错误。

答案 1 :(得分:0)

Wim Coenen ,谢谢,我认为MEF的破坏必须在部件上调用Destruct。 我确保以我需要的方式工作:

public partial class MyBootstrapper : MefBootstrapper
{
   public MyBootstrapper()
   {
      App.Current.Exit += new ExitEventHandler(Current_Exit);
   }

   void Current_Exit(object sender, ExitEventArgs e)
   {
      if (this.Container != null)
         this.Container.Dispose();
   }
...