我正在开发一个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应用程序)。
那么,发生了什么?我做错了吗?
答案 0 :(得分:1)
好的,我明白了。来自MSDN documentation:
该会员有一个 SecurityCriticalAttribute属性, 这限制了它的内部使用 Silverlight的.NET Framework 班级图书馆。应用程序代码 使用此成员抛出一个 MethodAccessException。
我已经将错误处理程序存储在App类的公共属性中,然后使用((App)Application.Current).ErrorHandler
访问它。我不喜欢这样做,但我想在这种特殊情况下没问题。
答案 1 :(得分:0)
为什么不能只使用ErrorHandler的静态实例?即有像ErrorHandler.Current这样的东西吗?
看起来你正试图手工构建一个穷人的IoC框架,说实话。 考虑对Unity / Ninject进行一些研究,亲眼看看为什么强类型解耦更好。