ASP.NET 是如何让 aspx 完全编译的呢?
2006-10-22 14:28
274 查看
我以前对这个问题一直持怀疑态度,因为.NET Framework里面就有很多TemplateControl处理类和方法挂上了Parse(或Parser)的字样,不过也有挂上Compile字样的。最近我确实测试了一次它是否完全编译:
我做了一个简单的纯asp页面:
<html>
<head>
<title>Now!</title>
</head>
<body>
<div><%=DateTime.Now%></div>
</body>
</html>
然后查看它的.dll,发现它自动生成了一个Page派生类,IRequiresSessionState也自动加上了,比普通的Page类多了一些双下划线开头的东西,例如两个双下划线开头的函数:
private void __BuildControlTree(Control __ctrl)
{
__ctrl.SetRenderMethodDelegate(new RenderMethod(this.__Render__control1));
}
private void __Render__control1(HtmlTextWriter __output, Control parameterContainer)
{
__output.Write("\r\n\r\n\r\n\r\n\r\n ");
__output.Write(DateTime.Now);
__output.Write("\r\n");
}
看来编译器会把html直接放到write的部分,中的逻辑再另外处理,例如Response.Write等效于等效于直接输出。至于它是怎么生成的,我还要研究研究才知道。另外这个功能不一定完全由CodeDom提供,可能CodeDom仅仅提供编译部分。Page类理论上是通过Parse来获取aspx里面的内容,然后把它们作为控件或者纯粹write出来的html添加到自己的内部,然而这时候得到的是一个对象的实例,不是一个类。假如由我设计ASP.NET,我会考虑是否存在可能性把一个实例转化为该类的派生类,或许ASP.NET真的是这样做的。
假如要把一个实例转化为一个类,这在Java或者.NET看来都并不难。例如在.NET里面,只需要把一个实例所包含的数据全部变为初始化数据放在类的初始化代码里面就行了,至于相关信息就放到meta-data里面,这个非常容易。如果.NET真的内置实现这种功能的东西,就一定要挖掘它出来。这意味着一种把逻辑缓存到dll的可能性,它拥有比缓存到内存更长久的保存性,同时因为它再次调用时无需再次编译所以这种缓存方式的效率也是绝对一流的。
我做了一个简单的纯asp页面:
<html>
<head>
<title>Now!</title>
</head>
<body>
<div><%=DateTime.Now%></div>
</body>
</html>
然后查看它的.dll,发现它自动生成了一个Page派生类,IRequiresSessionState也自动加上了,比普通的Page类多了一些双下划线开头的东西,例如两个双下划线开头的函数:
private void __BuildControlTree(Control __ctrl)
{
__ctrl.SetRenderMethodDelegate(new RenderMethod(this.__Render__control1));
}
private void __Render__control1(HtmlTextWriter __output, Control parameterContainer)
{
__output.Write("\r\n\r\n\r\n\r\n\r\n ");
__output.Write(DateTime.Now);
__output.Write("\r\n");
}
看来编译器会把html直接放到write的部分,中的逻辑再另外处理,例如Response.Write等效于等效于直接输出。至于它是怎么生成的,我还要研究研究才知道。另外这个功能不一定完全由CodeDom提供,可能CodeDom仅仅提供编译部分。Page类理论上是通过Parse来获取aspx里面的内容,然后把它们作为控件或者纯粹write出来的html添加到自己的内部,然而这时候得到的是一个对象的实例,不是一个类。假如由我设计ASP.NET,我会考虑是否存在可能性把一个实例转化为该类的派生类,或许ASP.NET真的是这样做的。
假如要把一个实例转化为一个类,这在Java或者.NET看来都并不难。例如在.NET里面,只需要把一个实例所包含的数据全部变为初始化数据放在类的初始化代码里面就行了,至于相关信息就放到meta-data里面,这个非常容易。如果.NET真的内置实现这种功能的东西,就一定要挖掘它出来。这意味着一种把逻辑缓存到dll的可能性,它拥有比缓存到内存更长久的保存性,同时因为它再次调用时无需再次编译所以这种缓存方式的效率也是绝对一流的。
相关文章推荐
- ASP.NET中把扩展名.aspx改成自定义的扩展名.mspx,如何在IIS与.net框架中配置
- ASP.NET中调用EXCEL后,如何完全释放Excel资源?
- 将母版页或ASPX等其他资源编译到DLL,在多个ASP.NET工程中共享
- HTML控件ID和NAME属性的区别,以及如何在asp.net页面的.CS文件中获得.ASPX页面中HTML控件的值(转载)
- 【转】如何充分利用ASP.NET 2.0预编译
- vs2005 asp.net aspx如何在新闻列表后加new图片
- C#操作Word完全方法·VS2005专业教程网|GotASPX.COM,专注于ASP.NET的专业教程网站
- HTML控件ID和NAME属性的区别,以及如何在asp.net页面的.CS文件中获得.ASPX页面中HTML控件的值
- ASP.NET中如何判断UpdatePanel是否完全执行
- ASP.NET中把扩展名.aspx改成自定义的扩展名.mspx,如何在IIS与.net框架中配置
- 浅析linux上如何让apache运行aspx网站即asp.net代码
- 如何在命令行下编译一个asp.net项目
- 将母版页或ASPX等其他资源编译到DLL,在多个ASP.NET工程中共享
- 如何充分利用ASP.NET 2.0预编译
- 如何:预编译 ASP.NET 网站
- HTML控件ID和NAME属性的区别,以及如何在asp.net页面的.CS文件中获得.ASPX页面中HTML控件的值
- 如何解决asp.net编译错误同时存在于不同DLL中
- 【转载】把aspx文件编译成DLL文件-.NET教程,Asp.Net开发
- 再谈asp.net中.aspx如何映射成html静态网页的方法(URL重写)
- ASP.NET中把扩展名.aspx改成自定义的扩展名.mspx,如何在IIS与.net框架中配置