• λ我爱Aspx >> Asp.Net >> 把单个aspx文件编译成DLL
  • 把单个aspx文件编译成DLL

  • :未知  Դ:internet  :2007-7-20 10:17:22  ؼ:aspx文件
  • aspx文件可以编译成DLL吗?如何编译aspx文件成DLL呢?aspx文件编译成DLL有什么好处呢?微软支持把aspx编译成DLL吗?为什么我们要把aspx文件编译成DLL呢?下面为你讲解把单个aspx文件编译成DLL

    从上一节微软公开描述的“言外之意”来看,微软是不支持让开发人员直接把aspx文件编译成DLL的。然而,Asp.Net高级界面技术(服务端HTML控件,WEB控件等等)都是需要通过aspx文件才能展现出来的,如果为了DLL的运行效率而放弃aspx的高级特性,则显然是得不尝失的。

     

    现在静下心来分析一下:

    csc编译器只是一个c#语言的编译器,它只能对符合C#语言规范的文件进行编译,而aspx文件的格式显然不符合c#语言规范,所以csc编译器是无法对aspx源文件进行编译的。

    因此,要想把aspx文件编译成dll文件,必然要先把aspx文件转化成csc编译器能识别的cs源文件。那么用什么工具来进行转换呢?虽然我深信这个工具一定是隐藏在.Net Framework里面,但在查阅了大量的Asp.Net及.Net的公开文档及参考手册,资料之后,仍找不到相关资料。

     

    呵呵,天无绝人之路,一个偶然的机会,还是让我发现了这个秘密。

     

    来看看源文件ex2.aspx:

     

    /* 源文件:ex2.aspx 开始 */

     

    <%@ Page Language="c#" %>

     

    <script runat="server">

     

    /*

    你没看错,下一行就是“abcdefg”,正是这一行,才让我有机会写出本篇文章^_^;

    在文中,我把这一行称作“代码陷阱”

    */

     

    abcdefg // 代码陷阱

     

    void Page_Load(Object src, EventArgs args)

    {

    if( !IsPostBack ) NoteLabel.Text = "请输入您的姓名:";

    }

     

    void OnNameSubmit(Object src, EventArgs args)

    {

    string name = f_Name.Value;

    NoteLabel.Text = (name=="") ? "姓名不能为空" : name +",您好。欢迎光临!";

    }

    </script>

     

    <html>

    <body>

    <form runat="server">

    <h1>DllTest - Ex2(例2)</h1>

    <hr>

    <asp:label runat="server" id="NoteLabel" style="color:red; font-weight:bold" />

    <input runat="server" id="f_Name" size="8">

    <button runat="server" onserverclick="OnNameSubmit">确定</button>

    </form>

    </body>

    </html>

     

    /* 源文件:ex2.aspx 结束 */

     

    如果把“代码陷阱”注释掉或删掉,那么ex2.aspx就是一个简单的Asp.Net文件,用IE浏览此页面可以发现它能正常工作。

     

    现在让我们打开“陷阱”,来看看Asp.Net到底返回了什么?

     

    返回的是一个“编译错误”的页面,报告源文件无法通过编译。让我们感兴趣的是该页面最下方的一个名为“显示完整的编译源”的超链接,点击些链接,就能看到这个由ex2.aspx转换而来的cs源文件(“完整的编译源”)的完整内容。把这部分“完整的编译源”去掉前面的行号信息和其它的一些编译开关(主要是#line编译命令),并关闭那个可爱的“代码陷阱”(用//把它注释掉或直接把它delete也行),整理后保存为ex2_aspx.cs:

     

    /* 源文件:ex2_aspx.cs 开始 */

     

    /*

    从下面的说明可以看出,确实有一个未公开的工具来完成把aspx文件转化成cs源文件

    */

    //------------------------------------------------------------------------------

    // <autogenerated>

    // This code was generated by a tool.

    // Runtime Version:1.0.3705.0

    //

    // Changes to this file may cause incorrect behavior and will be lost if

    // the code is regenerated.

    // </autogenerated>

    //------------------------------------------------------------------------------

     

    /*

    奇怪的是:命名空间居然是ASP而不是ASPX

    建议把该名称改成适合应用程序的名称,防止命名冲突,例如针对本文,可以改成DllTest

    这里没改是为了让大家看清它的原貌

    */

    namespace ASP {

    using System;

    using System.Collections;

    using System.Collections.Specialized;

    using System.Configuration;

    using System.Text;

    using System.Text.RegularExpressions;

    using System.Web;

    using System.Web.Caching;

    using System.Web.SessionState;

    using System.Web.Security;

    using System.Web.UI;

    using System.Web.UI.WebControls;

    using System.Web.UI.HtmlControls;

     

    /*

    1、注意一下类名的构成,如果必要,可以把它改成有意义的名称,例如针对本文,可以改成Ex2Page

    2、注意它的基类。Syste.Web.UI.Page实现了IHttpHandler接口,由于要访问Session,所以也实现了IRequiresSessionState接口。

    */

    public class ex2_aspx : System.Web.UI.Page, System.Web.SessionState.IRequiresSessionState {

     

    private static int __autoHandlers;

    protected System.Web.UI.WebControls.Label NoteLabel;

    protected System.Web.UI.HtmlControls.HtmlInputText f_Name;

    protected System.Web.UI.HtmlControls.HtmlButton __control3;

    protected System.Web.UI.HtmlControls.HtmlForm __control2;

    private static bool __intialized = false;

    private static System.Collections.ArrayList __fileDependencies;

     

    /* 现在可以关掉“陷阱”了 */

    // abcdefg

     

    void Page_Load(Object src, EventArgs args)

    {

    if( !IsPostBack ) NoteLabel.Text = "请输入您的姓名: ";

    }

     

    void OnNameSubmit(Object src, EventArgs args)

    {

    string name = f_Name.Value;

     

    NoteLabel.Text = (name=="") ? "姓名不能为空" : name +",您好。欢迎光临!";

    }

     

    /* 构造函数 */

    public ex2_aspx() {

    System.Collections.ArrayList dependencies;

    if ((ASP.ex2_aspx.__intialized == false)) {

    dependencies = new System.Collections.ArrayList();

     

    /*

    应该把下面这行注释掉,让DLL成为一个无依赖的独立文件

    防止在DLL运行时再次去查找、比较它的“依赖”文件的新旧

    */

    //dependencies.Add("W:\\wwwroot\\dlltest\\ex2.aspx");

    ASP.ex2_aspx.__fileDependencies = dependencies;

    ASP.ex2_aspx.__intialized = true;

    }

    }

     

    protected override int AutoHandlers {

    get {

    return ASP.ex2_aspx.__autoHandlers;

    }

    set {

    ASP.ex2_aspx.__autoHandlers = value;

    }

    }

     

    protected System.Web.HttpApplication ApplicationInstance {

    get {

    return ((System.Web.HttpApplication)(this.Context.ApplicationInstance));

    }

    }

     

    public override string TemplateSourceDirectory {

    get {

    return "/dlltest";

    }

    }

     

    private System.Web.UI.Control __BuildControlNoteLabel() {

    System.Web.UI.WebControls.Label __ctrl;

    __ctrl = new System.Web.UI.WebControls.Label();

    this.NoteLabel = __ctrl;

    __ctrl.ID = "NoteLabel";

    ((System.Web.UI.IAttributeAccessor)(__ctrl)).SetAttribute("style", "color:red; font-weight:bold");

    return __ctrl;

    }

     

    private System.Web.UI.Control __BuildControlf_Name() {

    System.Web.UI.HtmlControls.HtmlInputText __ctrl;

    __ctrl = new System.Web.UI.HtmlControls.HtmlInputText();

    this.f_Name = __ctrl;

    __ctrl.ID = "f_Name";

    __ctrl.Size = 8;

    return __ctrl;

    }

     

    private System.Web.UI.Control __BuildControl__control3() {

    System.Web.UI.HtmlControls.HtmlButton __ctrl;

    __ctrl = new System.Web.UI.HtmlControls.HtmlButton();

    this.__control3= __ctrl;

    System.Web.UI.IParserAccessor __parser = ((System.Web.UI.IParserAccessor)(__ctrl));

    __parser.AddParsedSubObject(new System.Web.UI.LiteralControl("确定"));

    __ctrl.ServerClick += new System.EventHandler(this.OnNameSubmit);

    return __ctrl;

    }

     

    private System.Web.UI.Control __BuildControl__control2() {

    System.Web.UI.HtmlControls.HtmlForm __ctrl;

    __ctrl = new System.Web.UI.HtmlControls.HtmlForm();

    this.__control2= __ctrl;

    System.Web.UI.IParserAccessor __parser = ((System.Web.UI.IParserAccessor)(__ctrl));

    __parser.AddParsedSubObject(new System.Web.UI.LiteralControl("\r\n <h1>DllTest - Ex2(例2)</h1>\r\n <hr>\r\n "));

    this.__BuildControlNoteLabel();

    __parser.AddParsedSubObject(this.NoteLabel);

    __parser.AddParsedSubObject(new System.Web.UI.LiteralControl("\r\n "));

    this.__BuildControlf_Name();

    __parser.AddParsedSubObject(this.f_Name);

    __parser.AddParsedSubObject(new System.Web.UI.LiteralControl("\r\n "));

    this.__BuildControl__control3();

    __parser.AddParsedSubObject(this.__control3);

    __parser.AddParsedSubObject(new System.Web.UI.LiteralControl("\r\n "));

    return __ctrl;

    }

     

    private void __BuildControlTree(System.Web.UI.Control __ctrl) {

    System.Web.UI.IParserAccessor __parser = ((System.Web.UI.IParserAccessor)(__ctrl));

    __parser.AddParsedSubObject(new System.Web.UI.LiteralControl("\r\n\r\n<html>\r\n<body>\r\n "));

    this.__BuildControl__control2();

    __parser.AddParsedSubObject(this.__control2);

    __parser.AddParsedSubObject(new System.Web.UI.LiteralControl("\r\n</body>\r\n</html>\r\n"));

    }

     

    protected override void FrameworkInitialize() {

    this.__BuildControlTree(this);

    this.FileDependencies = ASP.ex2_aspx.__fileDependencies;

    this.EnableViewStateMac = true;

    }

     

    public override int GetTypeHashCode() {

    return -11574299;

    }

    }

    }

     

    /* 源文件:ex2_aspx.cs 结束 */

     

    相信大家在分析了这个文件之后,会对Asp.Net运行原理有更进一步的认识(与本文无关,不详述)。

     

    在命令行状态,用如下的编译命令把ex2_aspx.cs编译成ex2.dll,并把它存放在bin目录下。

    csc /t:library /out:bin\ex2.dll ex2_aspx.cs

     

    在配置文件web.config中添加aspx->dll映射,即在system.web节的httpHandlers添加下面一行:

    <add verb="*" path="dlltest2.aspx" type="ASP.ex2_aspx, ex2" />

     

     

    现在当浏览器访问http://localhost/dlltest/dlltest2.aspx时,就如同访问ex2.aspx一样。当然,现在即使ex2.aspx不存在,或者已经更新过,也不会对页面访问有任何影响,除非重新生成bin\ex2.dll。

    Ҷƪл˵?
  • һƪ做完一个小网站的一点经验总结(1): asp.net 与access数据库结合
    һƪsqlserver的问题,占用内存逐渐升高,大家帮帮忙