• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    .NET 簡介、Hello World 和 .NET Runtime 一瞥

    發布: 2007-6-13 16:17 | 作者: 網絡轉載 | 來源: 網絡 | 查看: 63次 | 進入軟件測試論壇討論

    領測軟件測試網
      什么是 .NET
      Dr. GUI 對 .NET 框架的回顧
      全新的開始而不用從頭再來:.NET Runtime
      現在學習 .NET 的原因
      運行 Beta 1 所需的條件
      編寫 .NET 程序
      Hello World.NET
      實踐與探討

    Dr. GUI 回來寫教程了!

     如果您是 Dr. GUI 的 COM 和 ALT 系列欄目的忠實讀者,那么在過去的幾個月中或許會想念博士的聯機專欄文章。(對了,COM 和 ALT 系列的提前結束要歸咎于 Dr. GUI 的經理給博士安排了一項關于電子商務的工作。)

    但是至少 Dr. GUI 還繼續在 MSDN 新聞(英文)中主持“Ask Dr. GUI”欄目,F在,Dr. GUI 又有了新任務:幫助大家學習 .NET 框架。

    那為什么是 Dr. GUI.NET 呢?

     “Ask Dr. GUI”的熱心讀者都知道 Dr. GUI 特別熱衷于 Microsoft .NET,F在我們的博士也搞不清楚 .NET 到底包含什么不包含什么。(如果您想弄清楚這一點,請瀏覽 .NET Web 的正式站點 http://www.microsoft.com/net/。)這種命名的混亂讓人回想起 ActiveX? 時代。只要有促銷活動,就會有命名的混亂。Dr. GUI 贊成“ActiveX”中的“X”不發聲的主張,只可惜這主張已是昨日黃花。

    不管我們的博士是否清楚什么屬于 .NET 而什么不屬于,以及在未來幾年中它還會發生多大的變化,他確實理解對于開發人員至關重要的關鍵部分:.NET 框架。倒不僅僅是因為他“獲取”了這個部分,而是他為之興奮不已:它將使開發工作更有趣味也更有成效。而且,.NET 框架在未來的幾年中將不斷獲得改進,它不會消亡的。

    .NET 框架的不幸之處就是迄今為止它尚未上市,F在僅僅能夠得到技術和 Visual Studio.NET 的第一個 Beta 版,您可以在 .NET 的大本營:MSDN 的 .NET 開發人員中心的網站 http://msdn.microsoft.com/net/ 上獲得它。您可以只要 .NET 框架SDK 或者連同整個 Visual Studio.NET。Visual Studio.NET 包括了 .NET 框架SDK。這一點我們以后再聊。

    它是真的嗎?

     您或許會想起 Dr. GUI 有一個原則,就是不為那些不真實的東西寫文章。他很少冒險違反這個原則。(我們的博士曾經為 SQL Server? 2000 和 Windows? 2000 而惱火,他不得不在它們上市之前就寫了大量文章。事實證明博士基本上是正確的,大多人只有到能看到實際的產品時才能理解產品。直到現在,他還在為被稱為“Dr. Hormel”而傷心。)

    那為什么 Dr. GUI 現在就要為 .NET 寫文章呢?

    原因非常簡單:.NET 還未上市,不過它很是真實。您可以成為圈子里第一個下載 .NET 框架(或得到 CD)的人,然后自己先試用一下。您不必把博士的話當真。如果您不是要編寫明天就得交付的 .NET 應用程序,也不太介意風險的話,您可以從現在著手,開始用它來進行 2001 年晚些時候才需交付的新項目。這樣,您就可以先利用預發布版開始學習 .NET,在它上市之前就做好準備,領先您的同行一大步。

    什么是 .NET?

     現在要指出什么是 .NET 而什么不是還很困難。但是,如果您理解是哪些關鍵因素推動著 .NET,您也就更容易了解 .NET。

    世界的變化

     想想我們這個行業里出現的一些趨勢。很多人正在拋棄沒有聯網的單臺 PC 機,開始使用通過 Internet 同時連接到多個應用程序的 PC 機以及各種名目繁多的設備。連接到 Internet 的方式多種多樣,有線的、無線的,基帶的、寬帶的。他們開始期望無論身處何地,無論使用何種設備,都能夠以適當的形式獲得他們的重要信息。并且,既然能夠通過 Internet 獲得信息,他們就希望能把從多個來源獲得的數據合成為有意義的信息。最后,他們期望能夠從容地使用軟件而不必忙于安裝和升級,他們還期望這一切遠遠比過去的 PC 機可靠。

    那還只是在客戶端機器上發生的變化。Internet 已經使基于服務器的應用程序得到空前廣泛的應用。但是服務器之間的通訊,尤其是在不同平臺上運行的服務器之間的通訊特別困難。例如,處理不同的瀏覽器和瀏覽器的不同版本時是多么麻煩,更甭提各種不同的無線設備。并且因為大多數真實的 Internet 應用程序都是以數據庫為中心的,方便地訪問多種的數據源的能力比以往任何時候都更加重要。

    .NET 如何幫助您適應變化

     .NET 框架可以使您更輕松地實現這類功能。它包括用于設備的 .NET Compact Framework,這使得在各種設備上而不僅僅是在 PC 上利用 .NET Runtime 成為可能。從最底層開始,.NET 的設計就是以適應 Internet 的需要為目標,融合了各種 Internet 標準,包括對 Web 服務的支持,使程序可以方便地從多個站點上獲取數據;廣泛運用 XML 語言,使得不同計算機系統之間的數據互換變得簡單易行。.NET 還使您能夠更容易地訪問數據,更容易地編寫出能在眾多不同瀏覽器和設備上良好運行的 Web 應用程序,而不用再為每種設備或瀏覽器分別編寫程序。最后,.NET Runtime 支持簡化和可靠的安裝和升級,使用更簡便,可靠性更好。它和 .NET Runtime 的安全性及版本管理功能相結合,也提高了可靠性,并使軟件可以作為一種服務而不是產品來出售。

    使用 Web 服務將數據從多個數據源集成為可以使用的信息

     另一個重要的趨勢是應用程序為達到某種目的而從多個數據源集成信息。典型的示例就是計劃一個商務旅行:您需要機票、租用汽車和酒店。您想去商店購物,并希望所需的每一種商品的價格都符合您的標準,所以需要從三組不同公司中獲得數據;您的旅行還需要調整,以便按時到達,且到達時有汽車、有酒店房間(當然要有以太網),并且能及時回家。Web 服務使用 SOAP 和標準的 XML 架構幫助應用程序以業界標準的方式在 Internet 上通訊,所以應用程序可以使用并共享另一臺計算機上的信息,而不管另一臺計算機所使用的平臺。.NET 框架使編寫和使用 Web 服務成為一件非常簡單的事情。但是,如果您想要看用 .NET 實現復雜的真實 Web 服務示例,請打開網站 http://terraserver.microsoft.net/,上面展示了世界各地的地圖和航拍照片信息(Microsoft 的 TerraService 工程提供)以及其他信息,如美國人口普查數據。

    .NET 還包括 .NET Enterprise Servers 服務器軟件,它集成了 .NET 的功能并使它更易于使用。您可以在網站 http://www.microsoft.com/servers/net/ 上學習更多有關 .NET Enterprise Servers 的知識。

    最后還要說明重要的一點,Microsoft 要提供諸如身份驗證和日歷服務等功能作為 Web 服務,您可以像使用本地對象一樣方便地使用它。如果能夠以可負擔的價格購買所需的功能模塊,使用 OPWS(其他人員的 Web 服務,SEC [其他人的代碼] 的變種)通常是件好事。您也許有興趣了解第一個 Microsoft Web 服務,即 Passport 身份驗證服務 (http://www.passport.com/Consumer/default.asp?PPlcid=1033),根據點擊次數計算,即使是今天,該網站仍是十大 Web 站點之一。但是點擊次數是由使用 Passport 來驗證用戶身份的 Web 站點(例如 Hotmail)在幕后生成的。

    所以,.NET 框架使編寫新型的應用程序變得更簡單,這類應用程序容易安裝,并比以前的應用程序更可靠。因為這些程序利用了 Microsoft 和其他公司/人(也許就是您)提供的 Web Services,因此非常強大。

    Dr. GUI 對 .NET 框架的回顧

     Microsoft 操作系統 API 集的簡要歷史

     使用 .NET 框架編程不同于使用 Win32? API 編程,正如 Windows 編程與 DOS 編程大相徑庭。每一個 API 都是某一個時代的產品:DOS API 是八十年代早期的產品;Windows API 是八十年代中期的產品;而 .NET API 是九十年代后期的產品。

    DOS

     回溯 DOS API 的設計目的,是用于小型計算機系統上眾多單一任務操作系統。盡管在微機問世的時代很流行使用 UNIX 和 VMS 操作系統,但微機沒有足夠的內存或速度來運行這些相對來說較復雜的操作系統。由于內存和速度的限制,諸如 DOS 之類的操作系統主要用匯編語言編寫,所以它們盡可能地小而快。DOS 的 API 主要是絕對需要匯編語言(可能通過使用至少部分使用匯編語言編寫的運行時庫)來調用的軟件中斷調用(還記得 Int 21h 中斷嗎?)的集合,系統只提供了數量很少(低分)的服務,主要是面向磁盤和字符輸入/輸出模式。DOS 只支持單一任務(因此,只能執行單線程),并且 DOS 程序始終控制著計算機系統,當程序無事可做的時候,就循環檢測是否有鍵盤輸入。

    Windows

     Windows API 設計于八十年代早期,那時的美國總統是里根,C 語言是絕大多數系統程序員的首選語言。(某些重要的系統都是用 Pascal 語言編寫的,其性能和 C 語言相似。)Stroustrup 的 C++ 編程語言直到 1986 年才出版。那時正在風行“結構化編程”,程序員們學習如何避免使用 goto,直到九十年代,面向對象的編程才開始成為主流。

    結果是,只有 C(或 Pascal)程序員才會喜歡 Win32 API。有且僅有一個名稱空間,所有的數百個(后來是數千個)API 名稱很長,且 API 編寫者提出不同的命名慣例以將其分類。這些語言不直接支持抽象的數據類型,所以程序員又提出命名方案,例如 Microsoft 的匈牙利方案(Charles Simonyi 提出),在標識符的前面添加縮寫前綴來表示抽象的變量類型(如“i”表示索引,“c”表示計數,它們都用作基礎語言類型“int”)。

    但是在 Windows 中最重要的差別是使用了圖形用戶界面,因此必須完全重新調整程序的結構,因為 Windows 支持多任務(盡管不是在 Win16 中的多線程),當程序無事可做的時候,將控制權返回給操作系統。所以,不是由程序始終保持控制,而是將程序重新調整為消息句柄的集合,每個句柄都對來自操作系統的消息(例如,單擊鼠標和按鍵)做出回應,并盡可能快地將回應返回給操作系統,再等待下一條消息。在重新調整應用程序結構以后,Windows 的諸多特性開始發揮作用,如設備無關性和強大的標準化用戶界面功能,包括窗口、對話框、控件(如按鈕、列表框和編輯控件)以及菜單。

    面向對象的編程

     在九十年代早期,開始流行面向對象的編程。通過面向對象的編程,可以編寫在程序的對象之間具有較好定義的交互和極少量未定義的交互的較大項目。并且對象允許程序員以更有效的方式創建抽象概念,使編程較之以往更上一層。

    Visual Basic? 在運行時封裝了大量消息路由邏輯,程序員可以使用基于對象的方式,通過讓 Visual Basic 程序員集中編寫消息處理函數來進行 Windows 編程。當 C++ 成為流行語言時,諸如 MFC 的類庫允許允許程序員使用應用程序框架提供的大量默認交互來將 Windows 應用程序編寫為交互對象組。

    在面向對象的編程思想廣泛傳播之前,用 Visual Basic 和 MFC 程序編寫的 API 仍然是 Windows API。(公正地說,實際上 Windows 包含了面向對象的概念。)但是,Visual Basic 和 MFC 運行時庫的大小證明了一個事實,那就是需要越來越多的努力去彌補面向對象編程思想和舊編程思想(單層 API 集)之間的差距。

    組件
     九十年代中期開始流行一種新概念:軟件可以由可互換的組件構成,一套組件可以裝配出音頻系統或家庭影院。這個觀點是通過嚴格定義接口和根據明確定義的約定來實現的,您可以用相對容易的方法混合和裝配軟件的組件。

    支持基于組件的編程思想要求對 Windows、OLE 和 COM 中的單層 API 附加新內容。某些附加內容非常復雜,因為基于 C 的 API 從來不會自動支持諸如軟件對象的動態創建和對象的自動生存期管理等操作,不必提及 C 語言和 C++ 語言可用于編寫單片機的應用程序,這些應用程序不是由一組組件構成的。

    因此,編寫組件成為非常乏味的工作,并且需要文件和轉換器以彌補語言并不真正支持基于組件的編程這個缺憾。盡管 Visual Basic 和諸如 ATL 之類的庫減輕了編寫組件的乏味性,但許多高級的(但是有趣的)操作仍然相當困難。而且新版本組件常常由于 Windows 缺少支持靈活處理不同版本的特性而導致現有的應用程序中斷。

    如此多的功能,如此少的通用性

     最后,在這段時間里有各式各樣的 API 被添加到 Windows 中,致使編程模型中出現巨大的矛盾,甚至原始的 Windows API 也出現了一些矛盾,看一下窗口、菜單和控件的處理與設備環境、畫筆、字體和畫刷的處理之間的差異就能了解。但更嚴重的問題是:在 Windows 中大概有六種(也許更多,Dr. GUI 還未仔細計數)處理錯誤的不同方式。大概有六種字符串類型。這僅僅是冰山的一角而已。

    很清楚,在雜亂無章的 API 編程模型和對基于組件的程序和 Internet 編程的巨大支持的需求之間,恰恰是一種新型的、明確設計的、協調的現代 API 成熟的時機。Microsoft 推出了 .NET 框架以解決這些問題。

    全新的開始而不用從頭再來:.NET Runtime

     正如八十年代后期停止以舊的 DOS 方式編寫程序一樣(什么?放棄 TSR?),現在是時候讓 Windows 程序員們考慮一下了,擺脫使用單層、過時的 Windows API,轉而使用新型的、面向對象且基于組件的 API。Dr. GUI 建議您嘗試一下 .NET 框架和 Runtime 以便了解現代的 Runtime 是如何工作的。

    基于組件成為核心

     若要理解 .NET Runtime,您必須理解 .NET Runtime 的設計目的是直接在 Runtime 中為現代基于組件的編程提供第一手支持。換句話說,全部是圍繞組件進行的。如果您理解這一點,理解為什么要將 .NET Runtime 設計成現在的樣子就簡單多了。

    正如在 Windows 中添加了對窗口、控件、圖形和菜單的直接支持,為基于消息的編程添加了底層結構,為支持設備無關性添加了抽象內容一樣,.NET Runtime 直接支持組件(包括屬性和事件)、對象、繼承性、多態性和接口。它還提供支持以允許您使用二十多種不同編程語言中的任一種,仍然用非 .NET 代碼交互,而且不管這些代碼是在您本機上運行還是在不同的計算機上運行。換句話說,.NET 代表了一種全新的、現代化的起點,且不必從頭再來:您可以使用多種語言,從熟悉的語言到外來的語言,并繼續使用舊的組件和 DLL 而不用對其進行修改。您甚至可以象使用任何 COM 對象一樣使用 .NET 組件,這樣新的 .NET 代碼可以和舊的 COM 應用程序一起使用。(您也許想要將這種語言的靈活性與易于協作性與市場上的其他運行時系統,尤其是那些以“J”開頭的遺留代碼對比)。

    .NET Runtime 的其他主要功能的設計目的是為組件開發提供第一手支持。對屬性和事件的直接支持使得基于組件的編程變得更簡單,而不需要特殊的接口和適配設計模式。自動內存管理處理棘手的對象生存期問題。序列化支持允許以多種格式編寫“凍干”組件,包括基于業界標準 XML 的 SOAP(并不只是專利二進制格式),并且以后重新組織它們。有了調用和創建業界標準 Web 服務的能力,您可以向 Internet 上任何地方、使用任何設備的任何人展示組件,也可以使用 Internet 上任何地方的任何設備上的組件。例外提供了處理錯誤條件的有力、協調的方式。每個模塊都具有內置的完整元數據,這意味著諸如動態創建和方法調用之類的功能更容易,也更安全。(.NET 甚至允許您靈活地創建和執行代碼。)您可以控制應用程序使用的組件的版本,這使應用程序更可靠。最后,該代碼是與處理器無關的和易于驗證的中間語言 (IL),而不是某一種特定的機器語言,這意味著組件不但可以在多種計算機上運行,而且可以確保組件不會覆蓋它們不使用的內存,也不會潛在地導致系統崩潰。

    .NET Runtime 包含這里提到的每一個關鍵特征,所以,您可以很容易地編寫出有活力的面向對象的組件。

    請稍等,還有很多內容!

     .NET Runtime 除了提供全部強大的組件支持功能外,還包括大量的類,其設計目的是提供解決現代編程問題的底層結構,包括與 ASP.NET 協同工作的復雜的、基于組件的 Web 服務器應用程序支持(并支持將各種各樣的瀏覽器和移動設備作為客戶),XML 支持,增強的數據庫訪問等等。

    并且很快就要被標準化

     最后,.NET Runtime 的主要部分,即公共語言基礎結構 (CLI) 隨同 C# 語言和 IL 格式一起正處在由歐洲計算機制造協會(ECMA,標準化 JavaScript 和 JScript? 的組織,http://www.ecma.ch/ecma1/stand/ecma-262.htm)標準化的過程中,這將為其他公司在不同平臺上開發兼容的 .NET 實現鋪平道路。關于 C# 和 CLI 標準化的詳細信息,請參見 http://msdn.microsoft.com/net/ecma/。

    現在學習 .NET 的原因

     既然 .NET 還未正式上市,為什么要下載或定購 .NET 的 Beta 1 版,并且從現在就開始學習它?

    簡而言之,您已經有了很好的機會成為最先嘗試 .NET 并在它正式上市前已經準備就緒的人。對 Dr. GUI 來說,這是令人振奮的:您看,博士以前總在 Windows、MFC、COM 和 ATL 的潮流后面苦苦追趕,他多么希望自己能夠早一點學習這些技術。這一次,它充分利用這次機會率先窺探 .NET 的秘密。

    抓住學習 .NET 的機會

     所有早期的跡象都表明 .NET 框架必將成為高效且大受歡迎的編程平臺,所以它很快就會得到廣泛應用。早一點學習,就會處于有利于地位。在其他人對它還不甚了解的時候,您已經能熟練和高效地運用這項新技術工作。順便說一句,編寫 .NET 程序既簡單又有趣。

    Dr. GUI 的指示:.NET 的練習每周只需一小時
     ...讓程序更健壯

     因為 .NET 才出現不久,而且還未正式上市,Dr. GUI 建議您先走一步,就是:每周抽出一小時學習 .NET。

    這些教程文章每月發表兩次,其中包含的練習能幫助您真正地了解您所閱讀的內容。所以,假設您花一小時來閱讀這些文章(越往后閱讀文章所花的時間會越少),一、兩小時來做練習,那么您付出相對較小的努力就能學到一些有用的新技術——平均每周一小時。

    每周花費一小時學習,您得到的是關于 .NET 框架的牢固知識。您將對它的工作方式了如指掌,并且在 .NET 平臺上編程得心應手。

    和一個(兩個,或更多)朋友一起做

     一個有經驗的伙伴能夠幫助您處理許多問題,和您的朋友或同事一道學習 GUI.NET 將有助于您更好地完成學習,樂趣也更多。和一群人一起學就更好了?梢猿闪⒁粋討論小組,或者只是在完成每套練習時(或有問題而難以繼續時)互傳電子郵件。

    我們將討論的內容

     由于 .NET 框架非常巨大,您可能會感到疑惑,我們將討論些什么,什么時候討論?

    我們將從最基本的內容開始這個專欄。您已經閱讀過關于 .NET 框架要解決的問題。下一步,我們將討論 .NET Runtime 的各個方面,包括必要的“Hello World”程序,還將簡單介紹元數據和中間語言 (IL)——.NET 的機器語言。

    下一次,我們將開始討論 .NET 框架的基礎,包括所有類的父類,System.Object。我們還要討論垃圾回收和一些關于接口的內容。

    在此之后,將用幾篇文檔討論如何使用 .NET 框架和 Runtime 的基礎:數據類型、例外、文件和網絡 I/O、序列化、線程和計時器以及調試。

    然后,我們將了解 Windows 程序員熟悉和喜愛的圖形用戶界面類。

    .NET 框架中有許多用于訪問數據庫、XML 和 Web 應用程序的重要特征,但是博士目前計劃讓別人討論這些問題。

    每個專欄都有一個示例程序、示例的解釋以及您可以嘗試完成的練習,所有示例都用 C# 語言編寫,集中說明較大的概念,以便您能夠更好地理解 .NET 深處的設計技巧。

    使用 C# 語言的原因

     既然 .NET 支持大約二十種語言,為什么 Dr. GUI 所有關于 .NET 的專欄都使用稱之為 C# 的新語言來編寫?原因非常簡單:正如 C 語言是用來編寫 Windows 程序的,C# 語言是用來編寫 .NET 程序的。.NET 框架中的大多數內容都是使用 C# 語言編寫的,但是您可以在 .NET 中使用多種語言編程,用 C# 語言是為了在 .NET 中使用和支持基于組件的編程而特別設計的。同時,C# 語言還是一種非常好的編程語言。它易于使用,但是又沒有那些名稱以“J”開頭的語言所具有的問題。例如,您能夠以 C# 語言來編寫 swap 函數(在名稱以“J”開頭的語言中則不能這樣做,這是令 Dr. GUI 對那種語言產生反感原因之一)。

    另外,通過使用 C#,您在學習 .NET 的同時也學習了 C# 語言。如果您選擇使用另一種語言,看以 C# 語言編寫的示例不會帶來負面影響:.NET 框架和 Runtime 您使用的任何語言都適用。

    如果您更愿意使用其他某種語言,將代碼轉換為您所使用的語言相對來說比較簡單。但是 Dr. GUI 這個家伙卻沒有時間完成這項工作。如果有人想要進行這項工作,Dr. GUI 也許能夠提供到您的轉換后的代碼的鏈接——但這并非承諾。

    運行 Beta 1 版所需的條件

     運行 Visual Studio.NET 的 Beta 1 版所需的條件相當簡單:計算機的操作系統為 Windows 2000、Windows NT? 4.0、Windows 98 或 Windows Me。(可能會在以后的 Beta 版本中支持其他操作系統,例如 Whistler Beta 版和 Windows 95。)計算機還必須具備相當快的運算速度(要求 PII/450,建議使用 PIII/733)、1 GB 或 2 GB 硬盤空間、128 MB 內存(建議使用 256 MB 內存),至少有 Super VGA (SVGA) 視頻和 CD-ROM 或 DVD-ROM 驅動器。如果您只想安裝 .NET 框架SDK,CPU 和內存的要求可以稍微低一些;硬盤空間的需求可顯著降低(只需 100-200 MB 就足夠了)。

    您還需要安裝 Internet Explorer 5.5 (http://www.microsoft.com/windows/ie/)、MDAC (ADO) 2.6 (http://www.microsoft.com/data/download.htm) 和 Microsoft Web 服務器。(在控制面板中,單擊“添加/刪除程序”,然后單擊“添加/刪除 Windows 組件”。)如果您有 Visual Studio.NET 的 CD,安裝程序將自動更新 Internet Explorer 和 MDAC。

    安裝說明建議您在非生產用途的計算機上安裝。Dr. GUI 沒有發現 Visual Studio.NET 和/或 .NET 框架與其他軟件之間的不良影響,但是他贊成這個建議:不要在您賴以工作的計算機上冒險使用 Beta 版的軟件。事實上,Dr. GUI 在另一臺日常很少用的計算機上安裝了 .NET 框架。(盡管博士想過當一個冒險者,在他的膝上型電腦上安裝。)

    獲得 .NET 的方式

     最容易獲得 Visual Studio.NET 和 .NET 框架SDK 的地方是 MSDN .NET 開發人員中心 (http://msdn.microsoft.com/net/)。

    如果僅僅是想要簽出 .NET 框架,且具有很快的連接,那么您可以免費下載它(很大,大概 111 MB)。您也可以免費定購它,但您需要負擔 CD 的郵寄費用。.NET 框架SDK 包含編譯器(甚至 C#。,但不包括集成的開發環境 (IDE)。

    但是如果您想要定購 .NET 框架SDK 的 CD,請定購整個 Visual Studio.NET CD 集(其中包含三張 CD,您還是只需負擔郵寄費用)。如果您是 MSDN 全球訂戶,則只能下載 Visual Studio.NET,它的大小約為 1.5 GB,所以必須有真正快速的 Internet 連接。

    安裝

     絕大部分安裝都簡單易行,只需單擊適當的安裝程序或 URL 就可以了。安裝程序易于理解而又方便。

    不過,還是有一個小技巧:安裝 .NET 框架SDK 時,系統將詢問您是否注冊環境變量,以便可以從命令行生成。請確保選擇了這個復選框來注冊環境變量,這樣才能使用命令行工具。

    編寫 .NET 程序

     Visual Studio.NET 的設計目的是使 .NET 編程變得更簡單,除此之外,諸如自動完成語句和拖放窗體編輯之類的功能,使得使用不熟悉的 API 集變得極其簡單。

    我們將要使用 Visual Studio,但是現在博士要求大家用舊的方式做事:在記事本(或 Visual Studio,如果愿意)中編寫源文件,將其保存到磁盤上,然后編譯并從命令行運行。這些工作只需要 .NET SDK,而不需要 Visual Studio.NET。使用命令行工具也可以使我們有機會看到產生了什么文件和熟悉某些命令行工具。

    注意,因為從 Beta 1(當前版本)到最終上市的版本計劃會對 .NET API 做一些重要的改動。所以,您編寫的 Beta 1 版代碼必須要為在 Beta 2 或最終版本下運行而進行一些修改。但是,現在開始學習的重要概念是不會改變的,所以現在的學習并非徒勞無益。

    如何拼寫

     在 .NET 程序中使用大小寫的慣例也許和您所用過的其他語言不同。但是,.NET 的規則極其簡單:所有非參數名的標識符和私有域的名稱,其每個詞的首字母大寫,包括第一個。(Microsoft 建議將所有域都設為私有,但是它們也許要通過一個屬性公開。)對于參數名稱和私有域的名稱,其每個詞的首字母大寫,第一個除外。您必須了解這些規則,因為 .NET 框架名稱遵循這些規則,并且某些語言(如 C#)是區分大小寫的。

    所以,主要的輸出函數名為 System.Console.WriteLine,嚴格遵循大小寫規則。System.Console.WriteLine 的格式字符串參數名為 formatString,而不是 FormatString。但是字符串長度屬性的名稱是 StrLen,而不是 strLen。

    對于 Dr. GUI,最困難的事是要記住使用 Main 而不是 main。

    Hello World.NET

     現在,沒有問題了,這里是 .NET 最簡單的“Hello World”:

    class MyApp {
    public static void Main() {
    System.Console.WriteLine("Hello, world! (1)");
    }
    }

    類中的所有對象

     您首先注意到的可能是 Main 函數是類的成員。在 .NET 中,所有方法必須是類或結構的成員。(下次,我們將詳細討論結構。)這是因為在 .NET 中,組織的基本單位是類型(即類或結構)。Visual C++.NET 的托管 C++ 擴展允許您可以在類之外公開地編寫變量和函數,但在類中也可以編寫變量和函數:隱含的全局類。

    看!沒有頭文件!
    不但是類中的所有對象,而且類聲明都完成了。除了 C#(和大多數 .NET 語言)源代碼的源以外,沒有頭文件、IDL 文件或其他任何文件。所需要說明類的東西就是類本身。

    那么,如果您使用不在源文件中的其他類,會發生什么情況呢?編譯器如何明白這個類中的內容?

    答案是編譯器讀取包含您所使用的類的程序集中的元數據。程序僅僅隱式地使用 System.Object(因為所有對象來自于 System.Object)。C# 編譯器自動轉到 mscorlib.dll 程序集以從中獲得元數據,所以它能夠獲得需要用于 System.Object 的信息。如果使用不同程序集中的類,請在 C# 編譯器 (CSC) 命令行中使用 /r 選項以指定程序集,例如:

    csc /r foo.dll hello.cs

    順便提一句,模塊是一個可執行文件,即應用程序或庫。它的擴展名通常是 .exe 或 .dll。程序集是一個或多個模塊的集合。程序集中的一個文件具有程序集的清單,或該程序集中文件的列表。程序集是可以被部署和版本化的可執行代碼的最小單位(當以后我們查看程序集的清單時,您會注意到只有程序集有版本號)。

    Main 很特殊

     下一步您可能會注意到在 Main: public 和 static 上的修飾符。對 C# 中的成員的缺省訪問控制是 private,因此我們需要聲明 Main: public 以使它可以在運行時被調用。Main 是 static,也可以說是類方法,而不是實例方法。因此運行時可以調用它而不用關心創建 MyApp 對象并將該對象的 this 指針傳遞給 Main 對象。注意,這里我調用了 MyApp,您可以調用類中的任何對象。這個版本的 Main 不帶任何參數并且不返回任何東西,由 void 的返回類型表示。(可以編寫帶有其他參數的 Main 并返回值)。

    最后,我們調用 WriteLine 方法編寫字符串。我已經選擇使用函數 System.Console.WriteLine 的完全限定名。WriteLine 是一個 System 名稱空間中的 Console 類的 static 方法(和 Main 一樣)。

    減少鍵入

     經常輸入完全限定的類名是很麻煩的事情,所以 C# 允許您指定用 using 語句查找的名稱空間。例如:

    using System;
    class MyApp {
    public static void Main() {
    Console.WriteLine("Hello, world! (2)");
    }
    }

    因為編譯器搜索 System 名稱空間和 local 名稱空間,所以我們不必在 Console.WriteLine 的調用中指定 System。這并不是一個大的勝利,但是當您有許多對象引用和方法調用時,它非常方便。在下面的程序中您會看到這一點。

    等一下!別走開!

     在某些情況下(例如從文件管理器中運行 hello.exe),命令窗口可能會在您看到輸出之前消失。要防止發生這種情況,請調用 Console 的 ReadLine 方法從鍵盤上讀取,這將導致程序在您按 ENTER 鍵之前暫停。(我們將始終將它作為控制臺應用程序的 Main 中的最后一個語句。)

    程序如下所示:

    using System;
    class MyApp {
    public static void Main() {
    Console.WriteLine("Hello, world! (3)");
    Console.ReadLine(); // 等待直到按 Enter 鍵;最后一行
    }
    }

    看到了嗎?您可以在 C# 中交換!

     正如博士所提到的,與其他一些語言不同,您可以在 C# 中編寫交換兩個變量的函數。

    這是一個交換兩個整型變量內容的 C# 程序:

    using System;
    class SwapInts {
    public static void Main() {
    Int32 i = 1, j = 2;
    Console.WriteLine("i 是 {0}, j 是 {1}", i, j);
    Swap(ref i, ref j);
    Console.WriteLine("i 是 {0}, j 是 {1}", i, j);
    Console.WriteLine(
    "i 仍是 {1:####},j 仍是 {0:####}",
    j, i
    );
    Console.ReadLine();
    }

    static void Swap(ref Int32 a, ref Int32 b) {
    Int32 t = a;
    a = b;
    b = t;
    }
    }

    這里要注意一些事情。第一,博士已經選擇使用 .NET 框架類型 System.Int32(Int32 的全名)而不是 C# 類型 int。因為 C# 中的 int 只是 System.Int32 的一個簡單別名,此外沒有任何差別。但是,Dr. GUI 希望使用 .NET 框架類型而不是特定于 C# 的類型,這使得將示例轉換為 C# 以外的語言要容易一點。這些類型在所有語言中都是一致的。(當 Dr. GUI 用 C# 為 C# 程序員編寫代碼時,他趨向于使用 C# 類型,因為它們使他想起 C/C++ 類型,并且感覺很好。)

    下一步,注意 Console.WriteLine 所提供的靈活的格式。變量被插入到輸出字符串中,在括號中表達式 {0} 和 {1} 的位置。數字 0 和 1 代表將要被格式化的參數的位置。第一個參數編號為零而不是一。(數組編號也是從零開始的,這就是為什么這個專欄叫做 GUI.NET #0,而不是 #1)。您會注意到博士在最后的 WriteLine 語句中切換了變量。將格式字符串轉換到具有不同文法的語言時,能夠切換次序是非常重要的,即您可以改變格式字符串而不用改變調用。另外,還可以在括號中加入其他信息,正如在最后一條 WriteLine 語句中。這種格式化機制對于類型來說也是可擴充的。

    最后,請注意最重要的一點:在 Swap 的調用和函數聲明中,通過引用傳遞的參數用 ref 來標記。這就告訴了 C# 編譯器我們想要在調用方法時將交換 i 和 j 的方式。如果不使用 ref 標記,則要交換由值傳遞值時生成的副本(您可以試一下刪除 ref 的全部四個實例,然后親自查看結果)。

    實踐與探討
     
     讓我們動手吧!

     一旦安裝了 .NET,您就可以使用記事本或 Visual Studio 創建包含前面的“Hello World”程序之一的文件。創建一個空的子目錄,將文件保存到該子目錄中,并命名為 hello.cs(CS 表示為 C# 文件)。

    下一步,打開命令提示并更改到正在使用的目錄。鍵入“csc hello.cs”命令來編譯該程序。如果在目錄中查看,您將發現已經創建了 hello.exe 文件。鍵入“hello”執行該文件,控制臺窗口將顯示“Hello, World!”。

    可執行文件的內容

     列出目錄的內容,請注意只有兩個文件:hello.cs 和 hello.exe。Hello.exe 是一個非常小的文件,只有 3 KB 左右。真簡單。

    但是,hello.exe 文件中有些什么?這就不那么簡單了。有一個存根加載器,即很小的本機機器語言程序,它可加載 .NET Runtime 并給予其控制權以便使它開始執行您的程序。

    但是兩個重要的部分是元數據和 IL 中的代碼,元數據向 Common Language Runtime 和可能引用程序中的類型的編譯器解釋該程序。(您可能會想起 IL 是 .NET Runtime 的機器語言。)當 Runtime 即將開始執行每種方法時,它將 IL 轉換為本機代碼,然后執行本機代碼。.NET 從來不解釋 IL,它總是將 LI 編譯成本機代碼。

    如何查看元數據和 IL?使用 IL 反匯編 (ILDASM) 工具會使該操作變得非常簡單。只要在命令提示下輸入“ILDASM hello.exe”(假設 hello.exe 文件在當前目錄下)就可以了。您可以看到一個如下顯示的窗口。


     圖 1:ILDASM 窗口

    最初,“hello.exe”之下的目錄樹顯示兩個部分:清單和類 MyApp。由于模塊 hello.exe 有一個清單,所以我們知道它就是程序集的說明文件。在這種情況下,程序集僅包含一個模塊文件 hello.exe。

    清單

     雙擊清單將看到元數據的一小部分,這部分說明了這個程序集(應用程序或組件)中包含的模塊(文件)。對于第三個 hello.exe 程序,它看起來如下:

    .assembly extern mscorlib {
    .originator = (03 68 91 16 D3 A4 AE 33 )
    .hash = (52 44 F8 C9 55 1F 54 3F 97 D7 AB AD E2 DF 1D E0
    F2 9D 4F BC )
    .ver 1:0:2204:21
    }
    .assembly hello as "hello" {
    // --- 下面的自定義屬性是自動添加的
    // 不要取消注釋 -------
    // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(bool,
    bool) = ( 01 00 00 01 00 00 )
    .hash algorithm 0x00008004
    .ver 0:0:0:0
    }
    .module hello.exe
    // MVID: {59365AA0-B469-4359-9BAF-4840A9257C61}

    這個元數據聲明程序集 hello 的版本為 0.0.0.0,包含模塊 hello.exe,并且使用 1.0.2204.21 版本的 mscorlib 程序集(.NET Runtime 主 DLL)。模塊版本標識符 (MVID) 是一個包含此版本模塊 hello.exe 的 ID 的全局唯一標識符 (GUID)。

    模塊元數據

     如果按下 Ctrl+M 組合鍵,您將看到更多的元數據,這次是模塊的元數據,包括每個類和方法:

    Version of runtime against which the binary is built : 1.0.2204.21
    ScopeName : hello.exe
    MVID : {59365AA0-B469-4359-9BAF-4840A9257C61}
    // ... stuff removed
    TypeDef #1
    -------------------------------------------------------
    TypDefName: MyApp (02000002)
    Flags : [NotPublic] [AutoLayout] [Class] [AnsiClass] (00000000)
    Version : 0:0:0:0
    Extends : 01000001 [TypeRef] System.Object
    Method #1 [ENTRYPOINT]
    -------------------------------------------------------
    MethodName: Main (06000001)
    Flags : [Public] [Static] [HideBySig] [ReuseSlot] (00000096)
    RVA : 0x00002050
    ImplFlags : [IL] [Managed] (00000000)
    CallCnvntn: [DEFAULT]
    ReturnType: Void
    No arguments.
    Method #2
    -------------------------------------------------------
    MethodName: .ctor (06000002)
    Flags : [Public] [HideBySig] [ReuseSlot] [SpecialName] [RTSpecialName] [.ctor] (00001886)
    RVA : 0x00002062
    ImplFlags : [IL] [Managed] (00000000)
    CallCnvntn: [DEFAULT]
    hasThis
    ReturnType: Void
    No arguments.
    // ... REMOVED TypeRef #1 (System.Object .ctor)
    // ... REMOVED TypeRef #2
    // (System.Diagnostics.DebuggableAttribute .ctor)
    TypeRef #3 (01000003)
    -------------------------------------------------------
    Token: 0x01000003
    ResolutionScope: 0x23000001
    TypeRefName: System.Console
    MemberRef #1
    -------------------------------------------------------
    Member: (0a000002) WriteLine:
    CallCnvntn: [DEFAULT]
    ReturnType: Void
    1 Arguments
    Argument #1: String
    MemberRef #2
    -------------------------------------------------------
    Member: (0a000003) ReadLine:
    CallCnvntn: [DEFAULT]
    ReturnType: String
    No arguments.
    // ... REMOVED Assembly metadata; similar to Manifest above
    // ... REMOVED AssemblyRef #1 metadata; similar to Manifest above
    User Strings
    -------------------------------------------------------
    70000001 : (17) L"Hello, world! (3)"

    可以找到 MyApp 的定義 (TypeDef #1) 和兩種方法,即 constructor 方法和 Main 方法。(您并沒有編寫 constructor 方法,它是由 C# 編譯器提供的。)還可以看到對象的引用和程序引用的方法,例如 System.Console 及其 WriteLine 和 ReadLine 方法。還有一些是由編譯器提供的其他東西,如 System.Object 和 System.Diagnostics.DebuggableAttribute。這些東西已經從文章中刪除以使得文章更簡短。您可以通過生成 hello.exe 文件來查看這些內容并使用 ILDASM 進行檢查。我還刪除了程序集和程序集引用元數據,它們大多數都是所示的清單的重復。

    現在理解全部這些內容并不重要,但是博士希望您能看一下可執行文件中的元數據,他希望您能看到元數據包含所有 Runtime 和編譯器需要的有關程序集及其模塊、類型和成員(如方法)的信息。

    類元數據

     如果在主 ILDASM 窗口中雙擊 MyApp 類,您將看到 MyApp 類的兩個方法:constructor 和 Main。也可以看到類的元數據。

    在這種情況下,它表示(雙擊它時)MyApp 是從 System.Object 中衍生出來的,System.Object 是 mscorlib 程序集的一部分:

    .class private auto ansi MyApp
    extends [mscorlib]System.Object
    {
    } // end of class MyApp

    IL 代碼

     如果雙擊 Main,您將看到它的 IL 代碼:

    .method public hidebysig static void Main() il managed
    {
    .entrypoint
    // Code size 17 (0x11)
    .maxstack 8
    IL_0000: ldstr "Hello, world! (3)"
    IL_0005: call void [mscorlib]System.Console::WriteLine(class System.String)
    IL_000a: call class System.String [mscorlib]System.Console::ReadLine()
    IL_000f: pop
    IL_0010: ret
    } // end of method MyApp::Main

    注意 IL 非常簡單:將指針推到堆棧上的字符串并調用該方法就構成了對 Console.WriteLine 的調用。與此類似,ReadLine 的調用也很簡單,但是請注意,調用后返回值從堆棧中彈出(然后就被忽略了)。最后,Main 返回到其調用者。您也可以看到 Main 被聲明為入口點。

    Constructor 的 IL 同樣簡單:

    .method public hidebysig specialname rtspecialname
    instance void .ctor() il managed
    {
    // Code size 7 (0x7)
    .maxstack 8
    IL_0000: ldarg.0
    IL_0001: call instance void [mscorlib]System.Object::.ctor()
    IL_0006: ret
    } // end of method MyApp::.ctor

    它復制 this 指針,然后調用基礎類 (System.Object) 構造程序。

    現在進行交換

     下一步,遵循所述的步驟,從“實踐和探討”開始,在以前顯示的程序 SwapInts 上創建源文件,編譯然后運行。查看元數據并注意關于 Swap 函數的參數信息。還要看一下 Swap 的調用和 Swap 函數的 IL 代碼。

    在 Main 的 IL 代碼中,會看到一些加框指令。因為 Console.WriteLine 將非整數對象作為格式化字符串后面的參數,因此必須將整數轉化為對象。非對象的類型到對象的轉化稱為加框,并且使用加框指令在 IL 中完成。

    親自動手做更多事情

     如果還有額外的時間,請修改這里已經完成的程序并做一些您感興趣的事。為了幫助您完成這項工作,請使用 .NET 框架SDK 提供的文檔。

    啟動 .NET 框架SDK 概述頁面,您可以在其中找到所有需要的內容。.NET 框架SDK 的安裝程序在“開始”菜單和桌面上都放置了快捷方式。您尤其需要關注下列章節:

    • C# 示例、程序員指南和參考(在 .NET 框架SDK 文檔幫助文件中的 .NET 框架編譯器和語言參考下)
    • .NET 框架參考(也在幫助文件中)
    • .NET 框架開發人員指南(還是在幫助文件中)
    • 示例,尤其是快速入門的示例(注意,您必須展開它們,第一次從 .NET 框架SDK 概述頁面中選擇它們時,它們將自動展開)
    • IL 指令參考(可以在概述頁面的“工具開發人員指南”下找到)

    在文檔中查找所需的資料

     Visual Studio.NET 和 .NET 框架SDK 中包含的文檔浩如煙海。安裝 .NET 框架SDK 時,在“開始”菜單下的“.NET 框架SDK”上可以找到和這些文檔的鏈接。.NET 安裝程序還在桌面上放置概述的圖標。概述是最佳的出發位置——它包括通向所有文檔的鏈接,甚至到 IL 指令參考的鏈接。

    其中的許多文檔(并不是所有)目前可以在 http://msdn.microsoft.com/library/dotnet/cpguide/cpguide_start.htm 上聯機獲得。要想得到完整的文檔集,至少需要下載或定購 .NET 框架SDK。(例如,《工具開發人員指南》和所有的 C# 文檔及示例不能以聯機方式獲得)。

    請花一點時間從頭到尾瀏覽這些文檔,以查看其中包含的內容,您將驚奇地發現其中有大量的材料,盡管其中有很多尚待編寫。如果沒有找到所需的資料,請檢查概述頁面以查看它是否在與您所預期的不同章節中。

    在哪里可學習更多

     如果您真正想要快速掌握 .NET,請閱讀一些材料或參加有關的講座。Dr. GUI 曾參加過《Wintellect》(http://www.wintellect.com/) 的作者 Jeffrey Richter 先生的講座。Jeff 先生熟知他的材料,并且知道如何清楚地闡釋它們。Dr. GUI 從 Jeff 先生的講座中獲益非淺 — 這篇文章就是。(但是,Dr. GUI 承認,對于 Jeff 先生與 .NET Runtime 小組在同一幢辦公樓里工作,他有一點嫉妒。)其他公司,如 DevelopMentor (http://www.developmentor.com/),也提供了一些講座與資源。

    在 http://discuss.develop.com/ 上有一組 .NET 郵件列表,在 http://communities.microsoft.com/newsgroups/default.asp?icp=msdn&slcid=us 上有一系列新的 Microsoft 新聞組。DevelopMentor 的郵件列表非常繁忙,但是您可以瀏覽 Web 上的存檔文件,Microsoft 新聞組是新建的,內容并不多——現在正是加入其中投稿的好時機!

    最后,別忘了定期訪問 MSDN .NET 開發人員中心 (http://msdn.microsoft.com/net/) ,這樣才能不斷學習有關資源,跟上 .NET 的潮流。

    已經做的工作,下一步將要做的工作

     這次我們說了很多關于 .NET 的內容,尤其是關于 .NET 框架和 Runtime,以及為什么要關注它們。我們還介紹了如何獲得并安裝 .NET 框架SDK 和/或 Visual Studio.NET 的 Beta 1 版,然后在命令行運行一些簡單的程序。最后,簡略地談了一下這些程序的元數據和 IL,并花了一點時間瀏覽文檔。

    下一次,我們將討論所有 .NET 類的父類——為人熟知的 System.Object。我們還將討論內存分配和垃圾回收,以及一些有趣的接口和類型。

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/

    TAG: net world runtime 一瞥


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備2023014753號-2
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>