LYWILL设计运营 - 网站运营与推广、开发技术、成功项目展示。

ASP.NET动态编译原理

了解ASP.NET是如何进行编译的,对理解ASP.NET是如何工作的很有帮助。

动态编译的过程

动态编译的大体的执行流程:当ASP.NET收到一个基于某个page的request的时候,先判断该Page和相关的Source code是否编译过,如果没有就将其编译,如果已经编译,就是用已经Load的Assembly直接生成Page对象。在这里有下面几点需要注意:

  • 动态编译是按需编译的,ASP.NET只会编译和当前Request相关的aspx和code。
  • 动态编译是基于某个目录的,也就是说ASP.NET会把被请求的page所在的目录的所有需要编译的文件进行编译,并生成一个Assembly。
  • 除了编译生成的Assembly外,动态编译还会生成一系列的辅助文件。
  • 对相关文件的修改,会导致重新编译,但是修改对当前的Request不起作用。也就是说如果你对某个aspx进行修改,那么对于修改后抵达的Request,会导致重新编译,但是对于之前的Request使用的依然是原来编译好的Assembly。
  • 编译生成的文件被放在一个临时目录中,这个目录的地址为Windows Directory\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files你可以在web.config中的compilation section中设置你需要的临时目录。
 1: <compilation tempDirectory="d:\MyTempFiles" />

进一步剖析整个动态编译过程

现在我们来总结整个动态编译的过程:

  • Step1:当ASP.NET收到对于某个Page的Request,根据这个request对应的Url试着找到该page对应的Preservation File,如果没有找到,重新编译Page所在目录下的所有需要编译的文件,同时生成一些额外的文件,包括Preservation File。
  • Step2:然后解析这个Preservation File,通过hash和filehash判断文件自身或者是Dependent File是否在上一次编译之后进行过任何的修改,如果是的,则重新编译。然后重新执行Step2。
  • Step3:通过Preservation File 的assembly attribute Load对应的assembly(如果Assembly还没有被Load的话),通过type获知对应的aspx type,然后借助FastObjectFactory的对应的Create_ASP_XXX创建这个type。这个新创建的对象就是我们需要的Http Handler,在之上执行相应的操作把结果Response到客户端。