科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件编译asp.net 2.0项目到dll文件(一)

编译asp.net 2.0项目到dll文件(一)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

Asp.net不是asp的简单升级,而是微软。Net计划中的一个重要组成部分,它依托。Net的多语言与强大的类库支持,引进了服务端 HTML控件与WEB控件,自动处理控件的客户端与服务端的 交互,为开发人员提供了类似Windows下窗口编程的界面,为开发大型网络应用程序功能提 供了良好的编程接口,也能够极大地提高开发人员的工作效率。

作者:中国IT实验室 来源:中国IT实验室 2007年8月30日

关键字: Dll ASP.NET

  • 评论
  • 分享微博
  • 分享邮件
Asp.net不是asp的简单升级,而是微软。Net计划中的一个重要组成部分,它依托。Net的多语言与强大的类库支持,引进了服务端 HTML控件与WEB控件,自动处理控件的客户端与服务端的 交互,为开发人员提供了类似Windows下窗口编程的界面,为开发大型网络应用程序功能提 供了良好的编程接口,也能够极大地提高开发人员的工作效率。

    然而,"一次转换,两次编译"过程使得aspx文件在首次执行(或更 新后首次运行)时显得略有不足,特别是在拥有大量aspx及codebehind的代码文件的应用环境中,把aspx文件编译成DLL(在。Net中,被 称为应用程序集)后再发布,省去"一次转换、一次编译"的时间及CPU占用率,对提高WEB服务的整体性能会有较大的提升。当然,编译成DLL后,对源代 码的保密性也有一定程度的提高。

    本文通过对Asp.Net的基本处理流程及一个偶然发现的秘密的分析,介绍了在Asp.Net中 如何建立aspx到DLL的映射,如何开发一个可以处理HTTP请求/响应的DLL,以及如何设置"陷阱",把现成的单个aspx文件与 codebehind的aspx文件编译成DLL的过程,文章最后,还介绍了一个在实际操作过程的小技巧。

    由于本文要涉及Asp.Net应用程序、命令行编译、web.config配置文件等概念,为了使读者能更好地理解本文内容,也为了使本文看上去不显累赘,先就本文相对应的系统环境作一介绍:

    系统环境:Win2000(SP3)+ IIS5 + .Net Framework 1.0(中文版)。

    服务器名称:由于本文的例子均在本机上测试,服务器名称为localhost.

    IIS设置:建立虚拟目录dlltest(真实路径为w:\wwwroot\dlltest),并把它设为应用程序,在dlltest下建立bin目录。所有源文件将放在dlltest目录下,而所有dll文件将放在dlltest\bin目录下。

    Asp.Net应用程序配置文件——web.config在dlltest目录下建立一个web.config文件,初始时该文件内容如下:

<?xml version="1.0"?>
<configuration>
<system.web />
</configuration>

    命令窗口(DOS窗口)

    打开命令窗口,并用cd命令使当前目录为w:\wwwroot\dlltest.

    (一)建立aspx到dll的映射

    首先让我们来看看一般情况下aspx文件是如何被Asp.Net处理的:

    当一个HTTP请求(例如"http://webserver/webapp/webpage.aspx") 从客户端发送到IIS服务器时,IIS捕获并分析这个请求,

    è当它分析到这个请求是一个aspx页面时,立即以 "/webapp/webpage.aspx"为参数调用Asp.Net运行环境(aspnet_wp.exe),

    èAsp.Net环境启动后,检查 "/webapp/webpage.aspx"是否存在,若不存在,则向客户端返回HTTP 404(File not found)错误,

    è否则在 Asp.Net 的临时目录中查找相应的dll文件,若不存在或者该dll比aspx源文件"旧",则调用csc编译器(若aspx的服务端脚本语言是 VB或JScript,则调用相应的vbc编译器, jsc编译器)把aspx文件编译成dll,

    è然后Asp.Net再调用该dll来处理具体的客户请 求,返回服务器响应。

    从这个处理流程可以看出,一般情况下,Asp.Net运行环境会自动识别、检查、更新与aspx相对应的 dll.那么有没有其它办法可以强制把对一个aspx文件的处理"路由"到一个已编译存在的DLL呢?方法就是在Asp.Net应用程序配置文件 web.config的system.web节的httpHandlers节添加aspx到dll的映射项,语法如下:

    <add verb="*" path="aspx文件名" type="类名,dll文件" />

    aspx文件:需要被"路由"的虚拟名称,扩展名必须是aspx,否则IIS会先于Asp.Net运行环境处理该文件。

    dll文件: dll文件(应用程序集)的名称,不必输入".dll".ASP.NET 首先在应用程序的专用 \bin 目录中搜索程序集 DLL,然后在系统程序集缓存中搜索程序集 DLL.

    类名: 由于一个dll可能会有多个名称空间或多个类,因此必须指明当dll调用时自动加载哪个类。

    例如,某一Asp.Net应用程序的web.config文件如下:

<?xml version="1.0"?>
<configuration>
<system.web>
<httpHandlers>
<add verb="*" path="index.aspx" type="BBS.IndexPage, bbs" />
</httpHandlers>
</system.web>
</configuration>

    该配置文件告诉Asp.Net,在客户端请求本应用程序的index.aspx文件时,直接调用应用程序bin目录下的bbs.dll,并自动加载其中的BBS.IndexPage类。

(二)开发能处理HTML页面的DLL

    应该指出的是,并不是所有的应用程序集DLL都能实现HTTP请求/响应模式。还是来看一下Microsoft Asp.Net快速入门教程(http://chs.gotdotnet.com/quickstart/aspplus/)中关于"Http 处理程序和工厂"的描述:

    ASP.NET  提供低级别的请求/响应 API,使开发人员能够使用 .NET 框架类为传入的 HTTP 请求提供服务。为此,开发人员需创作支持  System.Web.IHTTPHandler 接口和实现 ProcessRequest() 方法的类。当处理 HTTP 请求不需要由高级别的 页框架抽象化提供的服务时,处理程序通常很有用。处理程序的常用用途包括筛选器和类似 CGI 的应用程序,尤其是那些返回二进制数据的应用程序。

    ASP.NET  收到的每个传入 HTTP 请求最终由实现 IHTTPHandler 的类的特定实例来处理。IHttpHandlerFactory 提供了处理  IHttpHandler 实例 URL 请求的实际解析的结构。除了 ASP.NET 提供的默认 IHttpHandlerFactory 类外, 开发人员还可以选择创建和注册工厂以支持大量的请求解析和激活方案。

    从这段文字可以看出,当aspx页面不涉及。net框架提 供的高级界面技术(如数据缓存、状态保持、Web窗体控件引用等等)时,且向客户端输出的不是复杂的HTML文本,特别是只向客户端返回二进制数据(如图 片,声音等)时,可以用一个。cs应用程序文件(本文使用c#语言,如果是用VB或JScript,……)来替代,而该应用程序必须有一个实现 System.Web.IHTTPHandler 接口和并实现 ProcessRequest() 方法的类。一个简单的例子如下:

1
2 /* 源文件:ex1.cs 开始 */
3 using System.Web;
4 namespace DllTest
5 {
6 /*类必须实现IHttpHandler接口。如果程序将访问会话状态(Session),则必须实现 IRequiresSessionState 接口(不包含任何方法的标记接口)。*/
7
8
9 public class Ex1Page : IHttpHandler
10 {
11 /*IsReusable属性告诉。Net框架,本程序是否可以被多个线程同时使用。
12 true对应是;false对应否。*/
13
14 public bool IsReusable
15 {
16 get  { return true; }
17 }
18
19
20
21 /*实现ProcessRequest方法,向客户端返回响应数据。
22 本例中向客户端返回一个简单的HTML页*/
23
24 public void ProcessRequest(HttpContext context)
25 {
26 HttpResponse res = context.Response;
27
28 res.Write("<html><body>");
29 res.Write("<h1>DllTest - Ex1(例1)</h1><hr>");
30 res.Write("本页面直接由DLL处理");
31 res.Write("</html></body>");
32 }}}
33/* 源文件:ex1.cs 结束 */ 

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

csc /t:library /out:bin\ex1.dll ex1.cs
可以但要写全路径
csc /t:library /out:j:\WebSite\WebTest\bin\ex1.dll
J:\WebSite\WebTest\App_Code\ex1.cs

    在配置文件web.config中添加aspx->dll映射,添加后,web.config应该是这样子的:

<?xml version="1.0"?>
<configuration>
<system.web>
<httpHandlers>
<add verb="*" path="dlltest1.aspx" type="DllTest.ex1Page,ex1" />
</httpHandlers>
</system.web>
</configuration>

    现在当浏览器访问http://localhost/dlltest/dlltest1.aspx时,实际上就是调用了ex1.dll中DllTest.Ex1Page类的ProcessRequest方法,在浏览中应该可以看到一个简单的页面。

    (三)把单个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浏览此页面可以发现它能正常工作。

查看本文来源
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章