AppDomain.UnhandledException

Никогда не задумывался над тем, что событие AppDomain.UnhandledException предназаначено для самого домена. То есть, если домен A создает домен B, и хочет получать все ошибки, которые в B произошли, то кода:
  domainB.UnhandledException +=
new UnhandledExceptionEventHandler(ErrorHandler);
будет маловато. Потому, что вызов между доменами это уже remoting, а значит начинается совершенно другая песня: MarshalByRefObject, ISerializable и ему подобное.
Один из выходов в данной ситуации - загрузить в домен B класс, который сделает все что надо прямо там, на месте:
     Loader ldr = (Loader)domainB.CreateInstanceAndUnwrap(
"assemblyName", "typeName");
ldr.RegisterErrorHandler();

где:
     void RegisterErrorHandler() {
AppDomain.CurrentDomain.UnhandledException +=
new UnhandledExceptionEventHandler(ErrorHandler);
}

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

Коментарі

Популярні дописи з цього блогу

OAuth-аутентификация через ВКонтакте

Українська мова