在ASP.NET中使用.NET組件
很多人在 @Import 和 @Assembly 頁(yè)面標(biāo)識(shí)的時(shí)候感到困惑,本文將為你解開(kāi)這些疑問(wèn),告訴你如何來(lái)使用.NET的組件。
和ASP中的類相比較有什么改變?
如果你以前曾經(jīng)開(kāi)發(fā)過(guò)ASP程序,那你應(yīng)當(dāng)是非常熟悉下面的一段代碼了:
<script runat="server" language="VBScript"> Dim fso Set fso = Server.CreateObject("Scripting.FileSystemObject") </script>
上面的代碼告訴我們?cè)贏SP當(dāng)中需要使用Server對(duì)象的CreateObject方法來(lái)建立一個(gè)類實(shí)例。上面的代碼中,首先聲明了變量fso,之后我們將變量fso賦于FileSystemObject的對(duì)象(FileSystemObject對(duì)象可以在Scripting這個(gè)庫(kù)中找到)。如果想要上面的ASP代碼得以正常運(yùn)行,我們必須確定相關(guān)的DLL文件已經(jīng)被安裝并且注冊(cè)到服務(wù)器。當(dāng)VBScript運(yùn)行庫(kù)被安裝的時(shí)候,F(xiàn)ileSystemObject對(duì)象是會(huì)被自動(dòng)注冊(cè)的。但是如果你想使用第三方開(kāi)發(fā)的組件或者使用你自己創(chuàng)建的組件,你就需要小心安裝并且注冊(cè)你的組件了。 接下來(lái)讓我們來(lái)看看,假設(shè)在ASP.NET中也存在FileSystemObject這個(gè)對(duì)象的話,我們應(yīng)當(dāng)如何來(lái)實(shí)例化它:
使用VB.NET : <script runat="server" language="VB"> Dim fso As Scripting.FileSystemObject = New Scripting.FileSystemObject() </script>
使用C#: <script runat="server" language="c#"> Scripting.FileSystemObject fso = new Scripting.FileSystemObject(); </script>
正如你所看到的一樣,在ASP.NET中實(shí)例化類是同ASP有所不同的。其中重要的不同點(diǎn)有:
在ASP.NET中已經(jīng)不再可以使用VBScript語(yǔ)言了,而是被功能強(qiáng)大的VB.NET所代替了 在ASP.NET當(dāng)中,在你聲明一個(gè)變量的同時(shí),可以指定它的類型并且初始化這個(gè)變量 為了引用一個(gè)類,需要使用這樣的表示方法:名稱空間[.子名稱空間].類。 在上面的例子當(dāng)中,我們引用了FileSystemObject這個(gè)類,而FileSystemObject這個(gè)類可以在名稱空間Scripting中找到。需要注意的是,上面的名稱空間實(shí)際上只是我們假設(shè)的一個(gè)名稱空間,它并不存在于.NET的架構(gòu)當(dāng)中,所以上面的代碼實(shí)際上是無(wú)法運(yùn)行的。換句話來(lái)說(shuō)就是,我們需要自己建立Scripting這個(gè)名稱空間并且在這個(gè)名稱空間當(dāng)中定義FileSystemObject這個(gè)類。
什么是名稱空間?
在前面的章節(jié)當(dāng)中我們已經(jīng)使用過(guò)“名稱空間”這個(gè)詞。利用名稱空間你可以將多個(gè)類組成在邏輯上相關(guān)的一些單元。通常,你會(huì)將一些提供相似功能或者具有相似狀態(tài)的類聚合在一起。比如名稱空間System.IO的一個(gè)實(shí)例就包含了那些用來(lái)處理輸入和輸出操作(比如:讀、寫(xiě)、刪除文件)的類。值得注意的是,名稱空間當(dāng)中的類要具有類似的功能或者類似的狀態(tài)并不是一個(gè)必須的要求。你可以按照任何規(guī)則自由的組織你自己的名稱空間,甚至可以沒(méi)有任何規(guī)則。
引用.NET組件
應(yīng)當(dāng)注意到了,我們給出的第一個(gè)ASP.NET的例子只是用來(lái)教學(xué)演示的---它是無(wú)法運(yùn)行的。現(xiàn)在讓我們來(lái)看一個(gè)能夠正常運(yùn)行的實(shí)際例子:
使用VB.NET建立Message對(duì)象 <%@ Assembly Name="System.Messaging.dll" %> <script runat="server" language="VB"> Dim myDir As System.Messaging.Message = New System.Messaging.Message() </script>
使用C#建立Message對(duì)象 <%@ Assembly Name="System.Messaging.dll" %> <script runat="server" language="C#"> System.Messaging.Message myDir = new System.Messaging.Message(); </script>
指令@Assembly表示將一個(gè)集合引用到當(dāng)前的頁(yè)面,從而使得所有在集合當(dāng)中定義的類、界面、結(jié)構(gòu)可以在當(dāng)前頁(yè)面自由的被使用。在我們上面給出的例子當(dāng)中,我們綁定了System.Messaging.dll這個(gè)集合。在這個(gè)集合當(dāng)中包含了System.Messaging這個(gè)名稱空間,System.Messaging名稱空間提供了存取.NET架構(gòu)消息的功能。我們建立了Message類的一個(gè)實(shí)例,從而可以利用它存取消息隊(duì)列當(dāng)中的消息了。如果我們需要在一個(gè)代碼綁定的文件中建立Message類,需要這樣做:
使用VB.NET在代碼綁定文件中建立Message對(duì)象 Public Class myPage Inherits System.Web.UI.Page Dim myDir As System.Messaging.Message = New System.Messaging.Message() End Class
使用C#在代碼綁定文件中建立Message對(duì)象 public class myPage : System.Web.UI.Page { System.Messaging.Message myDir = new System.Messaging.Message(); }
需要注意的是,如果我們想要編譯這個(gè)類,我們需要在編譯的時(shí)候通知編譯器我們需要引用System.Messaging.dll以及System.Web.dll這兩個(gè)文件。假設(shè)我們將上面的類保存成為一個(gè)文件(mypage.vb或者mypage.cs),之后我們需要這樣來(lái)編譯它: 編譯代碼綁定的類
vbc mypage.vb /r:System.Messaging.dll /r:System.Web.dll csc mypage.cs /r:System.Messaging.dll /r:System.Web.dll
傳遞給編譯器的參數(shù)“/r:System.Messaging.dll”和“/r:System.Web.dll”同一個(gè)在Web Form上使用的指令@Assembly起到的作用是相同的。
什么是集合?
一個(gè)集合是一組具有相似功能的邏輯單元的組合。他是基礎(chǔ)的,可以自描述的配置單元,具有版本控制,可重用,許可安全控制的屬性。它包含那些用來(lái)表現(xiàn)所有指定版本需求,安全標(biāo)示符和其他信息的集合名單。
引入名稱空間
我們已經(jīng)注意到了,無(wú)論什么時(shí)候我們引用Message對(duì)象,我們都需要提供完整的名稱空間路徑(也叫做完全限定的類名稱)。不難想象,時(shí)間長(zhǎng)之后,這將會(huì)帶來(lái)令人厭煩和不必要的臃腫代碼。幸運(yùn)的是,我們可以在一個(gè)頁(yè)面定義一個(gè)名稱空間的路徑,從而可以節(jié)約一些無(wú)謂的敲鍵盤(pán)的時(shí)間。
使用VB.NET引入一個(gè)集合 <%@ Assembly Name="System.Messaging.dll" %> <%@ Import Namespace="System.Messaging" %> <script runat="server" language="VB"> Dim myDir As Message = New Message() </script>
使用C#引入一個(gè)集合 <%@ Assembly Name="System.Messaging.dll" %> <%@ Import Namespace="System.Messaging" %> <script runat="server" language="C#"> Message myDir = new Message(); </script>
在我們的代碼綁定類中則應(yīng)當(dāng)這樣書(shū)寫(xiě):
使用VB.NET在代碼綁定文件中引入一個(gè)集合 Imports System.Web.UI Imports System.Messaging Public Class myPage Inherits Page Dim myDir As Message = New Message() End Class
使用C#在代碼綁定文件中引入一個(gè)集合 using System.Web.UI; using System.Messaging; public class myPage : Page { Message myDir = new Message(); }
通過(guò)指令@Import(同樣可以通過(guò)Imports或者using語(yǔ)句),我們可以指定一個(gè)名稱空間的路徑。這樣,我們?cè)谝靡粋(gè)類的時(shí)候,就不必使用完全限定的名稱空間路徑了。注意:如果在System.Web.UI和System.Messaging這兩個(gè)名稱空間中都有Message這個(gè)類的話,我們就必須使用完全限定的類名稱了。
清楚的知道引入的名稱空間能做什么和不能做什么是非常重要的。它不僅僅是節(jié)約了程序員的敲擊鍵盤(pán)的時(shí)間,更重要的是帶來(lái)了程序代碼的良好的可讀性。需要明白的是,真正正式將名稱空間連入到頁(yè)面的指令是:@Assembly或者使用參數(shù)/r進(jìn)行編譯。
通過(guò)配置文件自動(dòng)控制將集合連入到一個(gè)web form并不是只有使用@Assembly指令一個(gè)方式,集合也可以在一個(gè)application當(dāng)中自動(dòng)的被引入某個(gè)頁(yè)面。這樣的集合不需要指令@Assembly。我們可以在配置文件config.web中使用<assemblies>來(lái)自動(dòng)引入集合。
自動(dòng)的在配置文件當(dāng)中引入集合 <configuration> <compilation> <assemblies> <add assembly="System.Messaging"/> <add assembly="*"/> </assemblies> </compilation> </configuration>
這個(gè)星號(hào)“*”通知ASP.NET自動(dòng)引入在“應(yīng)用程序的私有集合緩沖區(qū)”中的每一個(gè)集合。通過(guò)<add>元素,你可以引入任何的名稱空間在application作用域之內(nèi)。
什么是應(yīng)用程序的私有集合緩沖區(qū)?
.NET的文檔中是這樣定義應(yīng)用程序的私有集合緩沖區(qū)的:應(yīng)用程序的私有集合緩沖區(qū)被看作是位于應(yīng)用程序下的子目錄\bin以及.NET構(gòu)架的安裝目錄。然而通過(guò)我的測(cè)試,只有\(zhòng)bin目錄才被當(dāng)作應(yīng)用程序的私有集合緩沖區(qū),也就是說(shuō)只有這個(gè)目錄才是星號(hào)“*”的作用域。
注意:在<add>元素中的星號(hào)“*”僅僅自動(dòng)連入那些位于應(yīng)用程序子目錄\bin中的集合! 通過(guò)查閱.NET架構(gòu)安裝的默認(rèn)配置文件:config.web。我們可以知道,他自動(dòng)的引入了如下的集合:
mscorlib System System.Data System.Diagnostics System.Drawing System.Net System.Text.RegularExpressions System.Web System.Web.Services System.Xml System.Xml.Serialization Microsoft.Comservices *
你可以自己看看默認(rèn)的config.web文件,也好確認(rèn)一下。下面的名稱空間也是自動(dòng)引入的:
Microsoft.VisualBasic System System.Collections System.Text System.Text.RegularExpressions System.Web System.Web.Caching System.Web.SessionState System.Web.Security System.Web.UI System.Web.UI.WebControls System.Web.UI.HtmlControls
|
溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!