Потребность знать, когда приложение закрывается

Существует ли способ контролировать, когда приложение, которое использует завершения dll? DLL и приложением является оба C#, ни один не Windows Forms.

Я могу проверить, когда главное приложение закрывается, но я хотел бы за DLL видеть, "что эй программа закрывает и выпускает меня, я должен сделать это реальное быстрый, прежде чем я умру".

Какой-либо способ сделать это? Или я застреваю, имея приложение, подают, "делают это перед смертью"?

7
задан Harry Johnston 2 May 2014 в 01:33
поделиться

4 ответа

Возможно, вам подойдет событие AppDomain.ProcessExit ? Обратите внимание на следующее (из документации):

Общее время выполнения всех обработчиков события обработчиков события ProcessExit ограничено, так же как общее время выполнения всех финализаторов ограничено при выключении. По умолчанию это две секунды. Неуправляемый хост может изменить это время выполнения, вызвав команду ICLRPolicyManager::SetTimeout method с перечислением OPR_ProcessExit значение.

8
ответ дан 7 December 2019 в 03:11
поделиться

Мы не знаем подробностей ваш код, но тот факт, что ваша библиотека классов должна знать, когда процесс завершается, может указывать на недостаток дизайна вашего приложения.

Если вам нужно освободить ресурсы или очистить другие вещи детерминированным способом, вам следует взглянуть на интерфейс IDisposable . Если классы, предоставляемые вашей библиотекой, реализуют этот интерфейс, вызывающий может легко заявить, что им больше не нужны функции dll, вызвав Dispose () .

Возможно, хорошей отправной точкой для дальнейшего чтения являются следующие статьи:

Например, у вас может быть следующий класс в вашей библиотеке классов:

using System;
using System.IO;

public class ResourceManager : IDisposable
{
    private Stream _resource;
    private bool _disposed;

    public void Dispose()
    {
        Dispose(true);

        // Use SupressFinalize in case a subclass
        // of this type implements a finalizer.
        GC.SuppressFinalize(this);
    }

    public void Dispose(bool disposing)
    {
        if (!_disposed)
        {
            if (disposing)
            {
                Console.WriteLine("Exiting Process. Cleaning up.");
                // free resources here
                if (_resource != null)
                    _resource.Dispose();
                Console.WriteLine("Object disposed.");
            }

            // Indicate that the instance has been disposed.
            _resource = null;
            _disposed = true;
        }
    }
}

В вашем основном модуле вы можете использовать его следующим образом; оператор using гарантирует, что вызывается метод Dispose () :

using System;
using System.Windows.Forms;

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        using (ResourceManager manager = new ResourceManager())
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}
1
ответ дан 7 December 2019 в 03:11
поделиться

AppDomain.ProcessExit будет "нормально" работать, но не гарантируется срабатывание, например, если процесс завершается диспетчером задач.Поэтому это может быть не идеально, если вашему драйверу устройства необходимо высвободить большие ресурсы и т. Д. (Т. Е. Они не могут быть выпущены до тех пор, пока за ним не займется сборщик мусора).

Подробнее см. Блог Рика Стальса .

0
ответ дан 7 December 2019 в 03:11
поделиться

Если это консольное приложение, вам нужно сделать как принятый ответ в этот вопрос . И лучше всего разрабатывать с использованием интерфейса IDisposable .

0
ответ дан 7 December 2019 в 03:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: