日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

编译asp.net文件为dll文件

發布時間:2025/3/15 asp.net 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 编译asp.net文件为dll文件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
編譯asp.net文件為dll文件 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:wwwrootdlltest),并把它設為應用程序,在dlltest下建立bin目錄。所有源文件將放在dlltest目錄下,而所有dll文件將放在dlltestin目錄下。

Asp.Net應用程序配置文件--web.config
在dlltest目錄下建立一個web.config文件,初始時該文件內容如下:

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

命令窗口(DOS窗口)
打開命令窗口,并用cd命令使當前目錄為w:wwwrootdlltest。




(一)建立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 首先在應用程序的專用 in 目錄中搜索程序集 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:binex1.dll ex1.cs
可以但要寫全路徑

csc /t:library /out:j:WebSiteWebTestinex1.dll

J:WebSiteWebTestApp_Codeex1.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=="http://www.blog.edu.cn/") ? "姓名不能為空" : 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=="http://www.blog.edu.cn/") ? "姓名不能為空" : 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(" <h1>DllTest - Ex2(例2)< /h1> <hr> "));



this.__BuildControlNoteLabel();

__parser.AddParsedSubObject(this.NoteLabel);

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

this.__BuildControlf_Name();

__parser.AddParsedSubObject(this.f_Name);

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

this.__BuildControl__control3();

__parser.AddParsedSubObject(this.__control3);

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

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(" <html> <body> "));

this.__BuildControl__control2();

__parser.AddParsedSubObject(this.__control2);

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

}





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:binex2.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不存在,或者已經更新過,也不會對頁面訪問有任何影響,除非重新生成binex2.dll




(四)把codebehind的aspx文件編譯dll




對 于把codebehind的aspx文件編譯dll,其中把aspx文件轉化成cs源文件的原理同上,也是先設置一個"代碼陷阱",然后把"完整的編譯 源"進行適當整理,保存為cs源文件。區別是在編譯dll時的步驟:(為敘述方便,假設界面文件為ex3.aspx,codebehind文件為 ex3.aspx.cs,ex3.aspx的"完整編譯源"保存為ex3_aspx.cs)

第一步:先用如下命令把ex3.aspx.cs編譯成binex3.aspx.cs.dll
csc /t:library /out:binex3.aspx.cs.dll ex3.aspx.cs

第二步:再用如下命令把ex3_aspx.cs編譯成binex3.dll
csc /t:library /r:binex3.aspx.cs.dll /out:binex3.dll ex3_aspx.cs

然后在配置文件web.config中添加aspx->dll映射,即在system.web節的httpHandlers添加下面一行:
<add verb="*" path="dlltest3.aspx" type="ASP.ex3_aspx, ex3" />

現在打開瀏覽器,訪問http://localhost/dlltest/dlltest3.aspx試試。
posted on 2008-01-23 13:47 暢想.net 閱讀(...) 評論(...) 編輯 收藏

轉載于:https://www.cnblogs.com/gostthink/archive/2008/01/23/1049999.html

總結

以上是生活随笔為你收集整理的编译asp.net文件为dll文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。