Консольное приложение C # - Как узнать, когда приложение закрывается? - PullRequest
1 голос
/ 01 октября 2010

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

Программа подключается к ряду событий, чтобы позаботиться об очистке. Моя проблема заключается в том, что это не работает должным образом при компиляции в режиме отладки, и это не работает должным образом при компиляции в режиме выпуска и запуска из VS (F5). В режиме выпуска, запустите из консоли или из файлового менеджера, все делает то, что он должен.

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

Что мне нужно сделать, чтобы этот код работал в режиме отладки и выпуска?

EDIT

Ошибка: Ошибка http://i51.tinypic.com/2ppndy8.png

точные шаги: 1) Нажмите F5 2) подожди секундочку 3) Нажмите [X] в окне консоли. 4) Ошибка, см. Связанное изображение выше

class Program
{
    public enum CtrlTypes
    {
        CTRL_C_EVENT = 0,
        CTRL_BREAK_EVENT,
        CTRL_CLOSE_EVENT,
        CTRL_LOGOFF_EVENT = 5,
        CTRL_SHUTDOWN_EVENT
    }

    static string conDB = "";

    [DllImport("Kernel32")]
    public static extern bool SetConsoleCtrlHandler(HandlerRoutine Handler, bool Add);
    public delegate bool HandlerRoutine(CtrlTypes CtrlType);
    private static bool ConsoleCtrlCheck(CtrlTypes ctrlType)
    {
        DatabaseAccess db = DatabaseAccess.Instance; //Issues Here

        // Cleanup code removed

        return true;
    }

    public static void ExitProcess(object sender, EventArgs args)
    {
#if DEBUG
        Debug("\n\n\nDebug Mode\nPress any key to continue...\n");
        Console.ReadKey(true);
#endif
    }

    static int Main(string[] args)
    {
        SetConsoleCtrlHandler(new HandlerRoutine(ConsoleCtrlCheck), true);
        AppDomain.CurrentDomain.ProcessExit += ExitProcess;

        // App code removed

        return 0;
    } // End main


    static void Debug(string text)
    {
        #if DEBUG
            Console.WriteLine(text);
        #endif
    }
}
...