Перехват события AppDomain.UnhandledException из неуправляемого кода - PullRequest
1 голос
/ 24 марта 2011

У меня есть приложение для хостинга CLR, написанное на неуправляемом C ++.Я хочу подписаться на событие AppDomain.UnhandledException из неуправляемого кода C ++.

Импортированный интерфейс AppDomain имеет следующий метод:

HRESULT add_UnhandledException (struct _UnhandledExceptionEventHandler *value);

Где UnhandledExceptionEventHandler определяется как:

struct __declspec(uuid("84199e64-439c-3011-b249-3c9065735adb"))
_UnhandledExceptionEventHandler : IDispatch {}; 

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

1 Ответ

2 голосов
/ 01 июня 2011

Я не видел, чтобы кто-то делал это, но это может помочь вам учесть следующее:

  1. управляемый делагат не является "простым" обратным вызовом в смысле c ++, он наследуется отобъект clr, код, который я видел в событиях перехвата c ++, всегда управлялся c ++.
  2. после запуска обработчика необработанного исключения, что происходит дальше, зависит от настроек политики clr (см. 3.)
    1. либо процесс завершен (по умолчанию)
    2. домен приложения выгружен
    3. или отключен clr
    4. проглотит исключение (поведение clr в .net 1.x)
  3. вы можете изменить действие по умолчанию на 2.2, 2.3, 2.4 через IHostPolicyManager
  4. Допустим, вы установили политику для выгрузки или отключения, вы можете использовать IActionOnCLREvent для настройки обратного вызована незагруженном / отключенном.
  5. с 3) и 4) вы можете настроить вашу систему
    1. на очистку / запись / сохранение (что вам когда-либо нужно) в управляемом коде в вашем UnhandledExceptionHandler
    2. ты не получишьограниченный разгрузкой вашего домена приложения в неуправляемом коде ... и делать то, что вам еще нужно сделать.
  6. при условии, что этого недостаточно (ваш неуправляемый код должен знатьнекоторые детали исключения) вы можете определить com интерфейсы (см. пример idl ниже);Ваше управляемое приложение реализует IMyApplication и ваш неуправляемый код IMyApplicationSink. Когда вы настраиваете свой домен приложения, передаваемый в неуправляемую реализацию IMypplicationSink (ваша ловушка), управляемое приложение должно вызывать эту ловушку в обработчике событий управляемого необработанного исключения:

    interface IMyApplicationSink : IUnknown
    {
        HRESULT UnhandeledExceptionCallback(
        [in] BSTR aString,
        [in] short aNumber,
        [in] SAFEARRAY( BYTE ) someBinaryData);
    }
    
    interface IMyApplicationControl : IUnknown
    {
        HRESULT OnStart(
        [in] IPhotonApplicationSink *sink);
    }
    

    Примечание: подробности о том, как получить пользовательский интерфейс com, см. В разделе «Внедрение IHostControl :: SetAppDomainManager» в разделе «Настройка среды выполнения общего языка Microsoft .NET Framework» (в настоящее время свободно читаемые части здесь )

  7. если вы не контролируете управляемое приложение, сначала загрузите приложение, которое находится под вашим контролем - домен приложения по умолчанию - там также будет вызываться обработчик необработанного исключения (см. msdn )

  8. если вы установите политику для проглатывания (2.4), ваш неуправляемый код не будет уведомлен, что clr продолжит работу - вы, конечно, можете объединить это с пользовательским интерфейсом com (6.)
...