2015-09-22 2 views
0

У меня есть сценарий, где при сбое приложения я должен очистить определенные ключи реестра. Я пытаюсь использовать для этого шаблон Dispose(). в случае сбоя приложения во время сбора мусора Dispose вызывается для очистки реестра ???Вызывается ли Dispose(), если произойдет сбой приложения?

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

любой совет или опыт в этом вопросе будет действительно оценен.

+0

Ваш вопрос может быть сведен к: «Вызывается ли' Dispose() ', если мое приложение выходит из строя, которое, вероятно, имеет ответ где-то. Ищите его. –

+0

Было бы довольно простым экспериментом, чтобы доказать, почему бы просто не сделать небольшую тестовую программу? Я бы не стал на это рассчитывать, используйте что-то вроде глобального обработанного обработчика исключений в домене приложения и сделайте свою очистку там. Не вызывает ли вызов UEH в вашем сценарии? Почему он непригоден, даже если его внешний код? Я предполагаю, что он по-прежнему загружается в текущий домен приложения? –

ответ

1

Похоже, вы хотите добавить обработчик события в событие AppDomain.UnhandledException, выполнить некоторую обработку (в этом случае записать в реестр), а затем позволить программе умереть.

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

Что-то вроде этого:

public static class CrashHandler 
{ 
    public static bool Initialized { get; private set; } 

    [SecurityPermission(SecurityAction.Demand, Flags=SecurityPermissionFlag.ControlAppDomain)] 
    static CrashHandler() 
    { 
     AppDomain.CurrentDomain.UnhandleException += crash_handler; 
     Initialized = true; 
    } 

    static void crash_handler(object sender, UnhandledExceptionEventArgs args) 
    { 
     // do your thing here 
    } 
} 

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

+0

Спасибо Кори, ваше решение будет легко соответствовать моей проблеме. благодаря –

Смежные вопросы