乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      把aspx文件編譯成DLL文件

       悟靜 2012-04-30
      說明:
          這是一篇介紹如何將ASPX文件編譯成DLL文件的文章,對于網(wǎng)頁源程序的保護應該有一定的幫助吧。里面的例子我都調(diào)試通過。不過在ASP.NET2.0的環(huán)境中好象有點問題——第三步的例子中,在ASPX文件中加了“代碼陷阱”之后,“編譯錯誤”的頁面中并沒有“顯示完整的編譯源”這一鏈接,而在ASP.NET1.1中就沒有這個問題。難道是MS意識到了這個問題特意將它屏蔽掉的??這也太!%%%^&&&***了吧???下面是原文全文摘錄,本文僅作技術(shù)學習使用,版權(quán)歸原作者所有。

      把aspx文件編譯成DLL文件


      浙江省紹興市解放北路148號交通大廈六樓 周杰忻

      前言

      Asp.net不是asp的簡單升級,而是微軟.Net計劃中的一個重要組成部分,它依托.Net的多語言與強大的類庫支持,引進了服務端HTML控件與WEB控件,自動處理控件的客戶端與服務端的 交互,為開發(fā)人員提供了類似Windows下窗口編程的界面,為開發(fā)大型網(wǎng)絡應用程序功能提供了良好的編程接口,也能夠極大地提高開發(fā)人員的工作效率。

      然而,“一次轉(zhuǎn)換,兩次編譯”過程使得aspx文件在首次執(zhí)行(或更新后首次運行)時顯得略有不足,特別是在擁有大量aspx及codebehind的代碼文件的應用環(huán)境中,把aspx文件編譯成DLL(在.Net中,被稱為應用程序集)后再發(fā)布,省去“一次轉(zhuǎn)換、一次編譯”的時間及CPU占用率,對提高WEB服務的整體性能會有較大的提升。當然,編譯成DLL后,對源代碼的保密性也有一定程度的提高。

      本文通過對Asp.Net的基本處理流程及一個偶然發(fā)現(xiàn)的秘密的分析,介紹了在Asp.Net中如何建立aspx到DLL的映射,如何開發(fā)一個可以處理HTTP請求/響應的DLL,以及如何設置“陷阱”,把現(xiàn)成的單個aspx文件與codebehind的aspx文件編譯成DLL的過程,文章最后,還介紹了一個在實際操作過程的小技巧。

      由于本文要涉及Asp.Net應用程序、命令行編譯、web.config配置文件等概念,為了使讀者能更好地理解本文內(nèi)容,也為了使本文看上去不顯累贅,先就本文相對應的系統(tǒng)環(huán)境作一介紹:

      系統(tǒng)環(huán)境:

      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文件,初始時該文件內(nèi)容如下:

      <?xml version="1.0"?>

      <configuration>

      <system.web />

      </configuration>

      命令窗口(DOS窗口)

      打開命令窗口,并用cd命令使當前目錄為w:\wwwroot\dlltest。

      一、建立aspx到dll的映射

      首先讓我們來看看一般情況下aspx文件是如何被Asp.Net處理的:

      當一個HTTP請求(例如“http://webserver/webapp/webpage.aspx”)從客戶端發(fā)送到IIS服務器時,IIS捕獲并分析這個請求,當它分析到這個請求是一個aspx頁面時,立即以“/webapp/webpage.aspx”為參數(shù)調(diào)用Asp.Net運行環(huán)境(aspnet_wp.exe),Asp.Net環(huán)境啟動后,檢查“/webapp/webpage.aspx”是否存在,若不存在,則向客戶端返回HTTP 404(File not found)錯誤,否則在Asp.Net 的臨時目錄中查找相應的dll文件,若不存在或者該dll比aspx源文件“舊”,則調(diào)用csc編譯器(若aspx的服務端腳本語言是VB或JScript,則調(diào)用相應的vbc編譯器, jsc編譯器)把aspx文件編譯成dll,然后Asp.Net再調(diào)用該dll來處理具體的客戶請求,返回服務器響應。

      從這個處理流程可以看出,一般情況下,Asp.Net運行環(huán)境會自動識別、檢查、更新與aspx相對應的dll。那么有沒有其它辦法可以強制把對一個aspx文件的處理“路由”到一個已編譯存在的DLL呢?方法就是在Asp.Net應用程序配置文件web.config的system.web節(jié)的httpHandlers節(jié)添加aspx到dll的映射項,語法如下:

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

      aspx文件:需要被“路由”的虛擬名稱,擴展名必須是aspx,否則IIS會先于Asp.Net運行環(huán)境處理該文件。

      dll文件: dll文件(應用程序集)的名稱,不必輸入“.dll”。ASP.NET 首先在應用程序的專用 \bin 目錄中搜索程序集 DLL,然后在系統(tǒng)程序集緩存中搜索程序集 DLL。

      類名: 由于一個dll可能會有多個名稱空間或多個類,因此必須指明當dll調(diào)用時自動加載哪個類。

      例如,某一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文件時,直接調(diào)用應用程序bin目錄下的bbs.dll,并自動加載其中的BBS.IndexPage類。

      二、開發(fā)能處理HTML頁面的DLL

      應該指出的是,并不是所有的應用程序集DLL都能實現(xiàn)HTTP請求/響應模式。還是來看一下Microsoft Asp.Net快速入門教程(http://chs./quickstart/aspplus/)中關(guān)于“Http 處理程序和工廠”的描述:

      ASP.NET 提供低級別的請求/響應 API,使開發(fā)人員能夠使用 .NET 框架類為傳入的 HTTP 請求提供服務。為此,開發(fā)人員需創(chuàng)作支持 System.Web.IHTTPHandler 接口和實現(xiàn) ProcessRequest() 方法的類。當處理 HTTP 請求不需要由高級別的頁框架抽象化提供的服務時,處理程序通常很有用。處理程序的常用用途包括篩選器和類似 CGI 的應用程序,尤其是那些返回二進制數(shù)據(jù)的應用程序。

      ASP.NET 收到的每個傳入 HTTP 請求最終由實現(xiàn) IHTTPHandler 的類的特定實例來處理。IHttpHandlerFactory 提供了處理 IHttpHandler 實例 URL 請求的實際解析的結(jié)構(gòu)。除了 ASP.NET 提供的默認 IHttpHandlerFactory 類外,開發(fā)人員還可以選擇創(chuàng)建和注冊工廠以支持大量的請求解析和激活方案。

      從這段文字可以看出,當aspx頁面不涉及.net框架提供的高級界面技術(shù)(如數(shù)據(jù)緩存、狀態(tài)保持、Web窗體控件引用等等)時,且向客戶端輸出的不是復雜的HTML文本,特別是只向客戶端返回二進制數(shù)據(jù)(如圖片,聲音等)時,可以用一個.cs應用程序文件(本文使用c#語言,如果是用VB或JScript,...)來替代,而該應用程序必須有一個實現(xiàn)System.Web.IHTTPHandler 接口和并實現(xiàn) ProcessRequest() 方法的類。一個簡單的例子如下:

      /* 源文件:ex1.cs 開始 */

      using System.Web;

      namespace DllTest

      {

      /*

      類必須實現(xiàn)IHttpHandler接口。如果程序?qū)⒃L問會話狀態(tài)(Session),則必須實現(xiàn) IRequiresSessionState 接口(不包含任何方法的標記接口)。

      */

      public class Ex1Page : IHttpHandler

      {

      /*

      IsReusable屬性告訴.Net框架,本程序是否可以被多個線程同時使用。

      true對應是;false對應否。

      */

      public bool IsReusable

      {

      get { return true; }

      }

      /*

      實現(xiàn)ProcessRequest方法,向客戶端返回響應數(shù)據(jù)。

      本例中向客戶端返回一個簡單的HTML頁面

      */

      public void ProcessRequest(HttpContext context)

      {

      HttpResponse res = context.Response;

      res.Write("<html><body>");

      res.Write("<h1>DllTest - Ex1(例1)</h1><hr>");

      res.Write("本頁面直接由DLL處理");

      res.Write("</html></body>");

      }

      }

      }

      /* 源文件:ex1.cs 結(jié)束 */

      在命令行狀態(tài),用如下的編譯命令把ex1.cs編譯成ex1.dll,并把它存放在bin目錄下。

      csc /t:library /out:bin\ex1.dll 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>

      現(xiàn)在當瀏覽器訪問http://localhost/dlltest/dlltest1.aspx時,實際上就是調(diào)用了ex1.dll中DllTest.Ex1Page類的ProcessRequest方法,在瀏覽中應該可以看到一個簡單的頁面。

      三、把單個aspx文件編譯成DLL

      從上一節(jié)微軟公開描述的“言外之意”來看,微軟是不支持讓開發(fā)人員直接把aspx文件編譯成DLL的。然而,Asp.Net高級界面技術(shù)(服務端HTML控件,WEB控件等等)都是需要通過aspx文件才能展現(xiàn)出來的,如果為了DLL的運行效率而放棄aspx的高級特性,則顯然是得不嘗失的。

      現(xiàn)在靜下心來分析一下:

      csc編譯器只是一個c#語言的編譯器,它只能對符合C#語言規(guī)范的文件進行編譯,而aspx文件的格式顯然不符合c#語言規(guī)范,所以csc編譯器是無法對aspx源文件進行編譯的。

      因此,要想把aspx文件編譯成dll文件,必然要先把aspx文件轉(zhuǎn)化成csc編譯器能識別的cs源文件。那么用什么工具來進行轉(zhuǎn)換呢?雖然我深信這個工具一定是隱藏在.Net Framework里面,但在查閱了大量的Asp.Net及.Net的公開文檔及參考手冊,資料之后,仍找不到相關(guān)資料。

      呵呵,天無絕人之路,一個偶然的機會,還是讓我發(fā)現(xiàn)了這個秘密。

      來看看源文件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 結(jié)束 */

      如果把“代碼陷阱”注釋掉或刪掉,那么ex2.aspx就是一個簡單的Asp.Net文件,用IE瀏覽此頁面可以發(fā)現(xiàn)它能正常工作。

      現(xiàn)在讓我們打開“陷阱”,來看看Asp.Net到底返回了什么?

      返回的是一個“編譯錯誤”的頁面,報告源文件無法通過編譯。讓我們感興趣的是該頁面最下方的一個名為“顯示完整的編譯源”的超鏈接,點擊些鏈接,就能看到這個由ex2.aspx轉(zhuǎn)換而來的cs源文件(“完整的編譯源”)的完整內(nèi)容。把這部分“完整的編譯源”去掉前面的行號信息和其它的一些編譯開關(guān)(主要是#line編譯命令),并關(guān)閉那個可愛的“代碼陷阱”(用//把它注釋掉或直接把它delete也行),整理后保存為ex2_aspx.cs:

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

      /*

      從下面的說明可以看出,確實有一個未公開的工具來完成把aspx文件轉(zhuǎn)化成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、注意一下類名的構(gòu)成,如果必要,可以把它改成有意義的名稱,例如針對本文,可以改成Ex2Page

      2、注意它的基類。Syste.Web.UI.Page實現(xiàn)了IHttpHandler接口,由于要訪問Session,所以也實現(xiàn)了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;

      /* 現(xiàn)在可以關(guān)掉“陷阱”了 */

      // 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 +",您好。歡迎光臨!";

      }

      /* 構(gòu)造函數(shù) */

      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 結(jié)束 */

      相信大家在分析了這個文件之后,會對Asp.Net運行原理有更進一步的認識(與本文無關(guān),不詳述)。

      在命令行狀態(tài),用如下的編譯命令把ex2_aspx.cs編譯成ex2.dll,并把它存放在bin目錄下。

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

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

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

      現(xiàn)在當瀏覽器訪問http://localhost/dlltest/dlltest2.aspx時,就如同訪問ex2.aspx一樣。當然,現(xiàn)在即使ex2.aspx不存在,或者已經(jīng)更新過,也不會對頁面訪問有任何影響,除非重新生成bin\ex2.dll。

      四、把codebehind的aspx文件編譯成dll

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

      第一步:先用如下命令把ex3.aspx.cs編譯成bin\ex3.aspx.cs.dll

      csc /t:library /out:bin\ex3.aspx.cs.dll ex3.aspx.cs

      第二步:再用如下命令把ex3_aspx.cs編譯成bin\ex3.dll

      csc /t:library /r:bin\ex3.aspx.cs.dll /out:bin\ex3.dll ex3_aspx.cs

      然后在配置文件web.config中添加aspx->dll映射,即在system.web節(jié)的httpHandlers添加下面一行:

      <add verb="*" path="dlltest3.aspx" type="ASP.ex3_aspx, ex3" />

      現(xiàn)在打開瀏覽器,訪問http://localhost/dlltest/dlltest3.aspx試試。

      五、一點小技巧

      在設置“陷阱”把aspx文件轉(zhuǎn)化成cs源文件時,一般是使用copy、paste方法把“完整的編譯源”保存在記事本或vs.net或其它asp.net開發(fā)環(huán)境,再進行整理后保存為cs源文件的。

      整理,就是把paste進來的行號信息與“#line”編譯指令去掉。如果是手動地刪掉這些信息,則會太麻煩,即使是一個簡單的如ex2.aspx的文件,也會產(chǎn)生約270行的“完整的編譯源”。

      我所使用的一個小技巧是:在記事本里,用替換的方法來快速整理。用"/* 行"來全部替換"行",用":*/"來全部替換":",用"http:// #line 行"來全部替換"#line",替換完成之后,再把“代碼陷阱”注釋掉,把主類構(gòu)造函數(shù)里設置“依賴文件”的語句全部注釋掉,這樣就算整理完成了。

        本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多