Выпуск ком-объектов при сбое приложения - PullRequest
4 голосов
/ 07 июля 2010

Есть ли способ освободить com-объекты при сбое приложения?

У меня есть следующий код:

  public class Application
    : IDisposable
  {
    private bool disposed = false;
    private object realApplication;

    public void Dispose()
    {
      Dispose(true);
    }

    private void Dispose(bool disposing)
    {
      if (!disposed) {
        if (realApplication!=null) {
          Marshal.ReleaseComObject(realApplication);
          realApplication = null;
        }
        disposed = true;
      }
      GC.SuppressFinalize(this);
    }

    ...


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

Но он освобождает ком-объект только при нормальном закрытии приложения.

Ответы [ 3 ]

3 голосов
/ 07 июля 2010

Попробуйте сделать ваш Application класс унаследованным CriticalFinalizerObject .

1 голос
/ 07 июля 2010

COM сам выполнит очистку объектов сервера out-proc, если клиент выйдет из строя, но только объекты, которые не работают никакими методами. Все запущенные методы, выполняемые на объекте, должны быть завершены, прежде чем этот объект может быть освобожден. Существует два надежных решения: либо запустить все методы в течение очень короткого периода времени, либо создать отдельный процесс для работы с COM-сервером.

1 голос
/ 07 июля 2010

Кнопка закрытия консоли не должна приводить к сбою - взгляните на функцию SetConsoleCtrlHandler.Это позволяет установить обработчик, который вызывается, когда пользователь нажимает кнопку «Закрыть», что позволяет выполнять очистку.

Вы не можете гарантировать возможность очистки при любых обстоятельствах;легко убить ваше приложение, не давая ему возможности убрать.Например, ваше приложение никогда не сможет обнаружить пользователя, убившего его с помощью диспетчера задач.

Если жизненно важно, чтобы приложение очищалось при любых обстоятельствах, вам может понадобиться второе приложение, которое отслеживаетпервый и очищает при необходимости.

...