Метод AppDomain.GetData не доступен?

Я занимаюсь разработкой приложения Silverlight 3 и хочу делегировать обработку всех непредвиденных ошибок в одном экземпляре класса, который я назвал ErrorHandler. У этого класса есть один названный метод HandleApplicationException, плюс пара других методов для обработки более специализированных ошибок.

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

public App()
{
    this.Startup += this.Application_Startup;
    this.Exit += this.Application_Exit;
    this.UnhandledException += this.Application_UnhandledException;

    AppDomain.CurrentDomain.SetData("ErrorHandler", new ErrorHandler());

    InitializeComponent();
}

А в случае необработанного исключения я получаю объект обработчика ошибок и использую его следующим образом:

private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
{
    e.Handled = true;

    var errorHandler = AppDomain.CurrentDomain.GetData("ErrorHandler") as ErrorHandler;
    Debug.Assert(errorHandler != null, "No ErrorHandler registered.");
    errorHandler.HandleApplicationException(e.ExceptionObject);
}

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

Итак, что происходит? Я делаю что-то неправильно?

9.11.2009 09:21:07
2 ОТВЕТА
РЕШЕНИЕ

Ладно, я понял. Из документации MSDN :

Этот член имеет атрибут SecurityCriticalAttribute, который ограничивает его для внутреннего использования библиотекой классов .NET Framework for Silverlight. Код приложения, использующий этот член, создает исключение MethodAccessException.

Я прибег к хранению обработчика ошибок в общедоступном свойстве класса App, а затем обращаюсь к нему с помощью ((App)Application.Current).ErrorHandler. Мне не нравится делать вещи таким образом, но я полагаю, что это нормально в этом особом случае.

1
9.11.2009 11:11:44

Почему вы не можете просто использовать статический экземпляр ErrorHandler? Т.е. есть что-то вроде ErrorHandler.Current?

Похоже, вы пытаетесь вручную создать IoC-структуру для бедного человека, если честно. Подумайте о некоторых исследованиях Unity / Ninject и убедитесь сами, почему разделение со строгим типом лучше.

0
9.11.2009 15:40:09
Как я объясняю в этом вопросе, я фактически использую Unity в приложении; но это особый случай, так как я хочу, чтобы объект был доступен даже тогда, когда контейнер Unity еще не был создан.
Konamiman 9.11.2009 16:15:43