asp.net编译模型
当一个web应用程序完成后,部署到iis中有以下几种方式:
源码部署:
就是把工程内的文件原封不动的Copy到iis中。当有请求的时候,asp.net会在编译目录的根目录下寻找一个以.compiled为扩展名的保留文件(Preservation File)。每一个Page页面都会有一个对应的保留文件。保留文件只会存在于编译根目录下。里面记录了Page类编译后的相关信息。如果没有,则会对请求的页面进行动态编译。编译生成dll的目录一般是C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 \Temporary ASP.NET Files。编译的范围是以目录为单位。编译的过程是将前台aspx页面与后台cs页合并生成dll,并在编译目录的根目录下生成一个保留文件。如果有,则判断从上一次编译后相关源代码是否进行过修改,如果修改过了,则再次编译。最后通过保留文件提供的信息来加载编译后的程序集及以后操作。
比如一个default.aspx页面。在dll中会产生两个与其对应的类:default与default_aspx。其中前者只编译了后台cs代码,后者才是default.aspx页面的最终体现。
优点:最灵活。
缺点:很差安全性。首次访问很慢
可更新的预编译部署:
这种方式会将所有后台cs文件编译到一个dll程序集中,当有请求时,会对相应的前台aspx文件与dll程序集中相应的类进行动态编译。
但是以这种方式生成的dll与完全动态生成的Dll有所不同:比如一个default.aspx页面,在bin目录中的dll里只会有 default类,没有default_aspx类,因为只是部份编译。等到对default.aspx页面进行了访问后,会在Temporary ASP.NET Files目录下生成另一个dll文件,此文件只包含default_aspx类,也就是说,只编译后台cs代码所生成的类与最终aspx与cs合并后生成的类不在一个程序集里面。
优点:灵活。
缺点:较差安全性。首次访问慢。
不可更新的预编译部署:
这种方式会将所有前台aspx与后台cs文件编译到一个dll程序集中,但还是会留下aspx占位文件。当有请求时,直接进行操作。
优点:不灵活。
缺点:无首次访问慢的问题。
参考的文章:
ASP.NET2.0编译模型
http://www.cnblogs.com/papaya73/archive/2008/07/04/1235977.html
深入剖析ASP.NET的编译原理之一:动态编译(Dynamical Compilation)
http://www.cnblogs.com/artech/archive/2007/05/21/753620.html
深入剖析ASP.NET的编译原理之二:预编译(Precompilation)
http://www.cnblogs.com/artech/archive/2007/05/26/760292.html