程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 第八章 用C#寫組件

第八章 用C#寫組件

編輯:C#入門知識

第八章    用C#寫組件

    這一章關於用C#寫組件。你學到如何寫一個組件,如何編譯它,且如何在一個客戶程序中使用它。更深入一步是運用名字空間來組織你的應用程序。
    這章由兩個主要大節構成:
    。你的第一個組件
    。使用名字空間工作

8.1  你的第一個組件
    到目前為止,在本書中提到的例子都是在同一個應用程序中直接使用一個類。類和它的使用者被包含在同一個執行文件中。現在我們將把類和使用者分離到組件和客戶,它們分別位於不同的二進制文件中(可執行文件)。
    盡管你仍然為組件創建一個 DLL,但其步驟與用C++寫一個COM組件差別很大。你很少涉及到底層結構。以下小節說明了如何構建一個組件以及使用到它的客戶:

    。構建組件
    。編譯組件
    。創建一個簡單的客戶應用程序

8.1.1  構建組件
    因為我是一個使用范例迷,我決定創建一個相關Web的類,以方便你們使用。它返回一個Web網頁並儲存在一個字符串
變量中,以供後來重用。所有這些編寫都參考了.NET框架的幫助文檔。
    類名為RequestWebPage;它有兩個構造函數——  一個屬性和一個方法。屬性被命名為URL,且它儲存了網頁的Web地
址,由方法GetContent返回。這個方法為你做了所有的工作(見清單8.1)。

    清單 8.1   用於從Web服務器返回HTML網頁的RequestWebPage 類

1: using System;
2: using System.Net;
3: using System.IO;
4: using System.Text;
5:
6: public class RequestWebPage
7: {
8:  private const int BUFFER_SIZE = 128;
9:  private string m_strURL;
10:
11:  public RequestWebPage()
12:  {
13:  }
14:
15:  public RequestWebPage(string strURL)
16:  {
17:   m_strURL = strURL;
18:  }
19:
20:  public string URL
21:  {
22:   get { return m_strURL; }
23:   set { m_strURL = value; }
24:  }
25:  public void GetContent(out string strContent)
26:  {
27:   // 檢查 URL
28:   if (m_strURL == "")
29:    throw new ArgumentException("URL must be provided.");
30:
31:  WebRequest theRequest = (WebRequest) WebRequestFactory.Create(m_strURL);
32:   WebResponse theResponse = theRequest.GetResponse();
33:
34:   // 給回應設置字節緩沖區
35:   int BytesRead = 0;
36:   Byte[] Buffer = new Byte[BUFFER_SIZE];
37:
38:   Stream ResponseStream = theResponse.GetResponseStream();
39:   BytesRead = ResponseStream.Read(Buffer, 0, BUFFER_SIZE);
40:
41:   //使用 StringBuilder  以加速分配過程
42:   StringBuilder strResponse = new StringBuilder("");
43:   while (BytesRead != 0 )
44:   {
45:    strResponse.Append(Encoding.ASCII.GetString(Buffer,0,BytesRead));
46:    BytesRead = ResponseStream.Read(Buffer, 0, BUFFER_SIZE);
47:   }
48:
49:   // 賦給輸出參數
50:   strContent = strResponse.ToString();
51:  }
52: }

    本應該利用無參數構造函數完成工作,但我決定在構造函數中初始化URL,這可能會很有用。當後來決定要改變URL
時——為了返回第二個網頁,例如,通過URL屬性的get和set訪問標志使它被公開了。
    有趣的事始於GetContent方法。首先,代碼對URL實行十分簡單的檢查,如果它不適合,就會引發一個
ArgumentException 異常。之後,我請求WebRequestFactory ,以創建一個基於傳遞給它的URL的WebRequest對象。
    因為我不想發送cookies、附加頭和詢問串等,所以立即訪問WebResponse(第32行)。如果你需要請求上述任何的功
能,必須在這一行之前實現它們。
    第35和36行初始化一個字節緩沖區,它用於從返回流中讀數據。暫時忽略StringBuilder 類,只要返回流中仍然有要
讀的數據,while循環就會簡單地重復。最後的讀操作將返回零,因此結束了該循環。
    現在我想回到StringBuilder類。為什麼用這個類的實例而不是簡單地把字節緩沖區合並到一個字符串變量?看下面這
個例子:
    strMyString = strMyString + "some more text";
    這裡很清楚,你正在拷貝值。常量 "some more text" 以一個字符串變量類型被加框,且根據加法操作創建了一個新
的字符串變量。接著被賦給了 strMyString。有很多次拷貝,是嗎?
    但你可能引起爭論
    strMyString += "some more text";
    不要炫耀這種行為。對不起,對於C#這是一個錯誤的答案。其操作完全與所描述的賦值操作相同。
    不涉及該問題的另外的途徑是使用StringBuilder類。它利用一個緩沖區進行工作,接著,在沒有發生我所描述的拷貝
行為的情況下,你進行追加、插入、刪除和替換操作。這就是為什麼我在類中使用它來合並那些讀自緩沖區中的內容。
    該緩沖區把我帶進了這個類中最後重要的代碼片段——第45行的編碼轉換。它只不過涉及到我獲得請求的字符集。
    最後,當所有的內容被讀入且被轉換時,我顯式地從 StringBuilder請求一個字符串對象並把它賦給了輸出變量。一
個返回值仍然會導致另外的拷貝操作。

8.1.2  編譯組件
    到目前為止,你所做的工作與在正常應用程序的內部編寫一個類沒有什麼區別。所不同的是編譯過程。你必須創建一
個庫而不是一個應用程序:
    csc /r:System.Net.dll /t:library /out:wrq.dll webrequest.cs
    編譯開關/t:library  告訴C#編譯,要創建一個庫而不是搜尋一個靜態 Main方法。同樣,因為我正在使用
System.Net名字空間,所以必須引用 (/r:)它的庫,這個庫就是System.Net.dll。
    你的庫命名為 wrq.dll,現在它准備用於一個客戶應用程序。因為在這章中我僅使用私有組件工作,所以你不必把庫
拷貝到一個特殊的位置,而是拷貝到客戶應用程序目錄。

8.1.3  創建一個簡單的客戶應用程序
    當一個組件被寫成且被成功地編譯時,你所要做的就是在客戶應用程序中使用它。我再次創建了一個簡單的命令行應
用程序,它返回了我維護的一個開發站點的首頁(見清單8.2)。

    清單 8.2    用 RequestWebPage 類返回一個簡單的網頁

1: using System;
2:
3: class TestWebReq
4: {
5:  public static void Main()
6:  {
7:   RequestWebPage wrq = new RequestWebPage();
8:   wrq.URL = "http://www.alphasierrapapa.com/iisdev/";
9:
10:   string strResult;
11:   try
12:   {
13:    wrq.GetContent(out strResult);
14:   }
15:   catch (Exception e)
16:   {
17:    Console.WriteLine(e);
18:    return;
19:   }
20:
21:   Console.WriteLine(strResult);
22:  }
成員
    
    注意,我已經在一個try catch語句中包含了對 GetContent的調用。其中的一個原因是GetContent可能引發一個
ArgumentException異常。此外,我在組件內部調用的.NET框架類也可以引發異常。因為我不能在類的內部處理這些異常,
所以我必須在這裡處理它們。
    其余的代碼只不過是簡單的組件使用——調用標准的構造函數,存取一個屬性,並執行一個方法。但等一下:你需要
注意何時編譯應用程序。一定要告訴編譯器,讓它引用你的新組件庫DLL:
    csc /r:wrq.dll wrclient.cs
    現在萬事俱備,你可以測試程序了。輸出結果會滾屏,但你可以看到應用程序工作。使用了常規的表達式,你也可以
增加代碼,以解析返回的HTML,並依據你個人的喜好,提取信息。我預想會使用到這個類新版本的SSL(安全套接字層),
用於ASP+網

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved