在ASP.NET中可以在很多地方执行初始化代码:
PreApplicationStartMethod
PostApplicationStartMethod
Application_Start
这些事件的顺序是什么?此列表中还有其他项目吗?
编辑:由于提到了静态变量与首次调用位置相关,因此我将为他们分解
WebActivator
PreApplicationStartMethod
中使用的Foo类WebActivator
PostApplicationStartMethod
中使用的Bar类Global.asax
Application_Start
中使用的Baz类为了清楚起见,假设在上述示例中,每个都依赖于该位置中使用的Foo / Bar / Baz类,并且该类包含静态构造函数和静态只读字段。
最佳答案
静态构造函数和静态字段初始化由运行时而不是ASP.NET确定。埃里克·利珀特(Eric Lippert)最近发布了一个很棒的four-part blog series,详细介绍了它们的工作方式。
至于您提到的其余项目,首先执行标有 System.Web.PreApplicationStartMethodAttribute
的方法。根据此属性的MSDN文档,不能保证调用这些方法的顺序。
根据Phil Haack的a blog post所说,此属性使开发人员有机会在应用程序启动期间调用其他两种方法: BuildProvider.RegisterBuildProvider
和 BuildManager.AddReferencedAssembly
。 MSDN的BuildManager.AddReferenceAssembly
文档指出,此方法只能在应用程序的Application_PreStartInit阶段执行,这表明必须执行System.Web.PreApplicationStartMethodAttribute
标记的所有方法。
WebActivator使用框架的PreApplicationStartMethodAttribute
挂钩应用程序的启动。一旦被调用,它将在动态注册an HttpModule之前搜索并执行WebActivator.PreApplicationStartMethodAttribute
标记的所有方法,然后在HttpApplication类中调用Application_Start之后动态注册ojit_a,稍后再调用PostApplicationStartMethodAttribute
标记的所有方法。
因此,总而言之,顺序为:
PreApplicationStartMethodAttribute
标记的方法WebActivator.PostApplicationStartMethodAttribute
的方法