第八章 用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方法。