AppDomain.GetData方法无法访问?

时间:2009-11-09 09:21:08

标签: silverlight silverlight-3.0 error-handling

我正在开发一个Silverlight 3应用程序,我想在一个名为ErrorHandler的类的单个实例中委派所有意外的错误处理。这个类有一个名为HandleApplicationException的方法,还有一些其他方法可以处理更多专门的错误。

在我的应用程序中,我使用Unity进行依赖注入,但由于我希望错误处理对象即使在尚未设置Unity容器时也可用,我将该对象注册为App类构造函数中的AppDomain全局数据,这样:

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应用程序)。

那么,发生了什么?我做错了吗?

2 个答案:

答案 0 :(得分:1)

好的,我明白了。来自MSDN documentation

  

该会员有一个   SecurityCriticalAttribute属性,   这限制了它的内部使用   Silverlight的.NET Framework   班级图书馆。应用程序代码   使用此成员抛出一个   MethodAccessException。

我已经将错误处理程序存储在App类的公共属性中,然后使用((App)Application.Current).ErrorHandler访问它。我不喜欢这样做,但我想在这种特殊情况下没问题。

答案 1 :(得分:0)

为什么不能只使用ErrorHandler的静态实例?即有像ErrorHandler.Current这样的东西吗?

看起来你正试图手工构建一个穷人的IoC框架,说实话。 考虑对Unity / Ninject进行一些研究,亲眼看看为什么强类型解耦更好。