Не звоните Утилизировать части в утилизировать MEF - PullRequest
0 голосов
/ 23 марта 2012

Я столкнулся с проблемой, когда приложение заканчивается, контейнер не вызывает метод Dispose для частей. Приложение на основе MEF.

Когда я явно вызываю Dispose для контейнера, тогда matod Dispose вызывается для деталей, но если вы просто закроете программу, Dispose для частей не будет вызываться, почему? Как убедиться, что при закрытии программы были вызваны методом Dispose всех частей контейнера MEF?

[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 ]

2 голосов
/ 24 марта 2012

Когда я явно вызываю Dispose для контейнера, тогда matod Dispose вызывается для деталей, но если вы просто закроете программу, Dispose для частей не будет вызываться, почему?

Потому что утилизация контейнера, когда вы закончите, обязательна. Если ваша программа не вызывает CompositionContainer.Dispose () перед выходом, то это ошибка в вашей программе.

0 голосов
/ 24 марта 2012

Вим Коенен , спасибо, я думал, что уничтожение 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();
   }
...
...