在ASP.NET中可以在很多地方执行初始化代码:

  • web.config已处理
  • WebActivator PreApplicationStartMethod
  • WebActivator PostApplicationStartMethod
  • Global.asax 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标记的所有方法。

    因此,总而言之,顺序为:

  • Web.config读入内存
  • PreApplicationStartMethodAttribute标记的方法
  • HttpApplication.Application_Start
  • 标有WebActivator.PostApplicationStartMethodAttribute的方法
  • 09-16 20:24