IT前沿技术
    IT名企招聘
    IT技术网站
首页 >> IT沙龙 >> IT前沿技术

Asp.net 2.0:Compile

一、 code-behind ( Asp.net 1.0/1.1 )
VS.NET 2002(2003) 用一种叫做 code-behind 的特性来将 html 、 control 和应用逻辑分开 , 默认的 code-behind 文件自动继承 System.Web.UI.Page 的特性 , 事件的自动对应连接 , 设计器的改动都会及时反映到 code-behind 文件中 , 省却了很多输入代码的时间 . 当第一次从 ASP 的混合开发转入这种形式开发后你已经会为这种功能带来的便利感到非常的兴奋 . 但是同时 code-behind 也带来了一些局限性 , 首先 , 任何 code-behind 文件的修改都必须导致整个 Project 重新编译 ; 其次 , 编译成单一的 Assembly 对于多人开发有一定的局限 ; 再者就是 .aspx 和 code-behind class 的同步问题 , 比如你可能会突然间发现不知道什么时候一个按钮竟然没有任何作用了 , 找了半天以后发现 , 原来 InitializeComponent() 中的事件邦定不知道什么时候在 code-behind class 中丢掉了 . 最后 , 添加单一的 .aspx 文件比较困难 , 尽管可以通过添加一个比如 .txt 文件来改名成 .aspx 文件 , 但是在这种情况下原先带 code-behind 的 aspx 文件所具有的一些 IDE 设计时支持此时就消失殆尽了 , 编辑这个 .aspx 文件根 notepad 没有太多不同 .

二、动态编译
为了解决 code-behind 带来的一些负面影响 ,Asp.net 2.0 提供了一些很有成效的功能 , 比如动态编译 . 故名思义 , 动态编译解决了每次修改 code-behind 文件都必须要重新编译整个 Project 的情况 , 而是在用户第一次请求的时候再动态编译 ,( 当然这时候带来一定的性能损失 ), 但之后就跟预编译没有什么不同了 , 这种情况特别适合于那种经常需要改变 class 文件的需求 , 不需要每次修改都要重新启动 Web Application.Asp.net 2.0 提供了一个特殊的文件夹 , 名字叫做 :Code. 在这个 \Code Directory 里面可以放入你的 Business Logic Component 或者 Data Access Component,Resource 资源文件等等 , 所以这些都不需要编译 , 而且开发环境同样支持智能提示 (VS.NET2002 中必须编译后才能实现这种功能 ).

三、预编译支持
尽管 Asp.net 2.0 提供了动态编译的功能 , 但是由于动态编译在用户首次访问会带来一定的性能冲击 , 并不是所有的情况都适合 , 而且你很可能在发布 Application 的时候不想暴露源代码 , 因此 ,Asp.net 2.0 同样支持预编译 ,Asp.net 2.0 支持两种不同的预编译 :
1 、 In-Place Precompilation
这种方式的预编译是通过类似这样的形式来实现的
localhost/WebApplication/precompile.axd
如果程序有错误 , 马上就会中断并显示大家都很熟悉的编译错误的画面以进行排错 , 如果一切正常 , 则显示如下的信息 :
The application was successfully precompiled.
这种预编译形式主要解决了动态编译带来的第一次访问的性能冲击 .
2 、 Precompilation for Deployment
这种形式的编译是由一个基于命令行的工具来完成了 , 其形式如下 :
aspnet_compiler /v /<websitename> –p <source> <destination>
下图是我测试的一个编译截图

这种模式的编译要求 <websitename> 必须是一个可用的 IIS 虚拟目录 . 默认的编译将产生只包含 .aspx 文件 ( 可能还含有 html 或者 gif 等等资源文件 ) 和一个 bin 目录 , 看上去类似 Asp.net 1.0(1.1), 但是如果你把 .aspx 文件全部删除以后你会发现 , 再次请求删除的 .aspx 文件照样可以响应 , 而不是返回 404 错误 , 这时因为 .aspx 文件也被编译了 , 并且放入 bin 目录中 .
总结 :
Asp.net 2.0 带来的三种新的编译模式使得 Asp.net 的编译更加的灵活 , 用户选择余地更大 ,VS.NET Whidbey 也对此提供了强大的智能提示支持 , 包括新增的 in-line code 和 runat=server 的 script 快的智能提示支持 , 所有的这些都已经开始临近 ......