九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Beginning C# 2008讀書筆記系列―― 介紹C# - 思索、堅韌、創(chuàng)新、成長 ...

Beginning C# 2008讀書筆記系列―― 介紹C#

這是本書的第一章將提供要掌握C#所需的基本知識。本章將提供C#和.NET Framework的視圖,包括C#和.NET Framework技術(shù),使用它們的動機,以及它們之間怎樣彼此聯(lián)系。

.NET Framework技術(shù)包含的許多概念從一開始就緊密的結(jié)合在一起。這意味著這里討論的.NET Framework將按照必要性簡要地介紹一些新概念。然而,快速著眼于基礎(chǔ)是理解怎樣用C#編程的本質(zhì)。

在概述性的介紹之后,本章將提供C#語言自身比較簡單的介紹,包括C#起源于并類似C++。

1.1 什么是.NET Framework?

.NET Framework是Microsoft為發(fā)展中的應(yīng)用程序而設(shè)計開發(fā)的新的、革命性的平臺。有許多關(guān)于這個論述是多么含糊不清的趣事――但這是有很多原因的。首先,注意.NET Framework不僅僅是"在Windows操作系統(tǒng)上開發(fā)應(yīng)用程序。"雖然Microsoft發(fā)行的.NET Framework運行在Windows操作系統(tǒng),工作在其他操作系統(tǒng)上的替代版本將很快成為可能。Mono就是個例子,Mono是一個運行在多個操作系統(tǒng)的.NET Framework開源版本,包括不同風味的Linux和Mac操作系統(tǒng)。另外,可以在個人數(shù)字助理(PDA)類型的設(shè)備,甚至一些智能電話上使用微軟.NET Framework(本質(zhì)上是完整.NET Framework的子集)。一個使用.NET Framework關(guān)鍵的動機是.NET Framework底層是有意作為匯聚多種根本不同的操作系統(tǒng)而使用的。(即基于.NET Framework的應(yīng)用程序是可以在多個完全不同的操作系統(tǒng)上運行的。)

另外,先前定義的.NET Framework包括了對應(yīng)用程序的類型沒有限制是合理的。這是因為它們是不受限制的――.NET Framework允許創(chuàng)建Windows程序、Web應(yīng)用程序、Web服務(wù),以及其他相當多你能想到的任何事。

.NET Framework是為任何語言而設(shè)計的,因此任何語言都能使用它;其中包括C#、C++、Visual Basic、Jscript和一些更老的語言諸如COBOL。為了這個目的,這些針對語言的特定版本.NET Framework也出現(xiàn)了,并且更多版本將始終發(fā)行。它們不僅訪問.NET Framework而且能彼此通信。C#開發(fā)人員調(diào)用由Visual Basic開發(fā)人員編寫的代碼這是完全可能的,反之亦然。

所以這些都是為可用性提供難以想象的水平而準備的,而可用性是怎樣使用.NET Framework的一部分,諸如誘人的前景。

.NET Framework是什么?

.NET Framework主要有巨大的代碼庫構(gòu)成,該代碼庫可以通過客戶端語言(諸如C#)使用面向?qū)ο螅∣OP)技術(shù)訪問。該代碼庫被分類為不同的模塊――可以根據(jù)你想要實現(xiàn)的目的而使用相應(yīng)的部分。例如,包含構(gòu)建Windows應(yīng)用程序的模塊,包含構(gòu)建網(wǎng)絡(luò)編程的模塊,包含構(gòu)建Web開發(fā)的模塊等等。許多模塊被分解為更多的特定子模塊,諸如構(gòu)建Web服務(wù)的模塊是構(gòu)建Web開發(fā)的一個內(nèi)部模塊。

由于不同操作系統(tǒng)的目的不同,因此這些操作系統(tǒng)支持部分的或全部的模塊,取決于它們的特性。例如,PDA支持.NET核心部分,但不太可能需要一些更深奧的模塊。

部分.NET Framework定義了一些基本類型。類型是數(shù)據(jù)的一種表現(xiàn)形式,指定其中一些最基礎(chǔ)的部分(諸如32位有符號整數(shù)),以便使用.NET Framework在不同語言之間提供交互操作。這稱為通用類型系統(tǒng)(CTS)。

除了支持這個庫之外,.NET Framework還包含.NET Framework通用語言運行庫(CLS),主要負責維護所有使用.NET庫開發(fā)的應(yīng)用程序的運行。

【MSDN】

.NET Framework 具有兩個主要組件:公共語言運行庫和 .NET Framework 類庫。公共語言運行庫是 .NET Framework 的基礎(chǔ)。您可以將運行庫看作一個在執(zhí)行時管理代碼的代理,它提供內(nèi)存管理、線程管理和遠程處理等核心服務(wù),并且還強制實施嚴格的類型安全以及可提高安全性和可靠性的其他形式的代碼準確性。事實上,代碼管理的概念是運行庫的基本原則。以運行庫為目標的代碼稱為托管代碼,而不以運行庫為目標的代碼稱為非托管代碼。.NET Framework 的另一個主要組件是類庫,它是一個綜合性的面向?qū)ο蟮?span style="COLOR: #c00000">可重用類型集合,您可以使用它開發(fā)多種應(yīng)用程序,這些應(yīng)用程序包括傳統(tǒng)的命令行或圖形用戶界面 (GUI) 應(yīng)用程序,也包括基于 ASP.NET 所提供的最新創(chuàng)新的應(yīng)用程序(如 Web 窗體和 XML Web Services)。

.NET Framework 可由非托管組件承載,這些組件將公共語言運行庫加載到它們的進程中并啟動托管代碼的執(zhí)行,從而創(chuàng)建一個可以同時利用托管和非托管功能的軟件環(huán)境。.NET Framework 不但提供若干個運行庫宿主,而且還支持第三方運行庫宿主的開發(fā)。

例如,ASP.NET 承載運行庫以為托管代碼提供可伸縮的服務(wù)器端環(huán)境。ASP.NET 直接使用運行庫以啟用 ASP.NET 應(yīng)用程序和 XML Web Services。

Internet Explorer 是承載運行庫(以 MIME 類型擴展的形式)的非托管應(yīng)用程序的一個示例。使用 Internet Explorer 承載運行庫使您能夠在 HTML 文檔中嵌入托管組件或 Windows 窗體控件。以這種方式承載運行庫使得托管移動代碼(類似于 Microsoft® ActiveX® 控件)成為可能,不過它需要進行重大改進(如不完全受信任的執(zhí)行和獨立的文件存儲),而這種改進只有托管代碼才能提供。

下面的插圖顯示公共語言運行庫和類庫與應(yīng)用程序之間以及與整個系統(tǒng)之間的關(guān)系。該插圖還顯示托管代碼如何在更大的結(jié)構(gòu)內(nèi)運行。

.NET Framework 環(huán)境


 

.NET Framework 類庫

.NET Framework 類庫是一個與公共語言運行庫緊密集成的可重用的類型集合。該類庫是面向?qū)ο蟮模⑻峁┠约旱耐泄艽a可從中導(dǎo)出功能的類型。這不但使 .NET Framework 類型易于使用,而且還減少了學習 .NET Framework 的新功能所需要的時間。此外,第三方組件可與 .NET Framework 中的類無縫集成。

例如,.NET Framework 集合類實現(xiàn)一組可用于開發(fā)您自己的集合類的接口。您的集合類將與 .NET Framework 中的類無縫地混合。

 

公共語言運行庫的功能

公共語言運行庫管理內(nèi)存、線程執(zhí)行、代碼執(zhí)行、代碼安全驗證、編譯以及其他系統(tǒng)服務(wù)。這些功能是在公共語言運行庫上運行的托管代碼所固有的。

至于安全性,取決于包括托管組件的來源(如 Internet、企業(yè)網(wǎng)絡(luò)或本地計算機)在內(nèi)的一些因素,托管組件被賦予不同程度的信任。這意味著即使用在同一活動應(yīng)用程序中,托管組件既可能能夠執(zhí)行文件訪問操作、注冊表訪問操作或其他須小心使用的功能,也可能不能夠執(zhí)行這些功能。

運行庫強制實施代碼訪問安全。例如,用戶可以相信嵌入在網(wǎng)頁中的可執(zhí)行文件能夠在屏幕上播放動畫或唱歌,但不能訪問他們的個人數(shù)據(jù)、文件系統(tǒng)或網(wǎng)絡(luò)。這樣,運行庫的安全性功能就使通過 Internet 部署的合法軟件能夠具有特別豐富的功能。

運行庫還通過實現(xiàn)稱為通用類型系統(tǒng) (CTS) 的嚴格類型驗證和代碼驗證基礎(chǔ)結(jié)構(gòu)來加強代碼可靠性。CTS 確保所有托管代碼都是可以自我描述的。各種 Microsoft 和第三方語言編譯器生成符合 CTS 的托管代碼。這意味著托管代碼可在嚴格實施類型保真和類型安全的同時使用其他托管類型和實例。

此外,運行庫的托管環(huán)境還消除了許多常見的軟件問題。例如,運行庫自動處理對象布局并管理對對象的引用,在不再使用它們時將它們釋放。這種自動內(nèi)存管理解決了兩個最常見的應(yīng)用程序錯誤:內(nèi)存泄漏和無效內(nèi)存引用。

運行庫還提高了開發(fā)人員的工作效率。例如,程序員可以用他們選擇的開發(fā)語言編寫應(yīng)用程序,卻仍能充分利用其他開發(fā)人員用其他語言編寫的運行庫、類庫和組件。任何選擇以運行庫為目標的編譯器供應(yīng)商都可以這樣做。以 .NET Framework 為目標的語言編譯器使得用該語言編寫的現(xiàn)有代碼可以使用 .NET Framework 的功能,這大大減輕了現(xiàn)有應(yīng)用程序的遷移過程的工作負擔。

盡管運行庫是為未來的軟件設(shè)計的,但是它也支持現(xiàn)在和以前的軟件。托管和非托管代碼之間的互操作性使開發(fā)人員能夠繼續(xù)使用所需的 COM 組件和 DLL。

運行庫旨在增強性能。盡管公共語言運行庫提供許多標準運行庫服務(wù),但是它從不解釋托管代碼。一種稱為實時 (JIT) 編譯的功能使所有托管代碼能夠以它在其上執(zhí)行的系統(tǒng)的本機語言運行。同時,內(nèi)存管理器排除了出現(xiàn)零碎內(nèi)存的可能性,并增大了內(nèi)存引用區(qū)域以進一步提高性能。

最后,運行庫可由高性能的服務(wù)器端應(yīng)用程序(如 Microsoft® SQL Server™ 和 Internet 信息服務(wù) (IIS))承載。此基礎(chǔ)結(jié)構(gòu)使您在享受支持運行庫宿主的行業(yè)最佳企業(yè)服務(wù)器的優(yōu)越性能的同時,能夠使用托管代碼編寫業(yè)務(wù)邏輯。

使用基于公共語言運行庫的語言編譯器開發(fā)的代碼稱為托管代碼;托管代碼具有許多優(yōu)點,例如:跨語言集成、跨語言異常處理、增強的安全性、版本控制和部署支持、簡化的組件交互模型、調(diào)試和分析服務(wù)等。

若要使公共語言運行庫能夠向托管代碼提供服務(wù),語言編譯器必須生成一些元數(shù)據(jù)來描述代碼中的類型、成員和引用。元數(shù)據(jù)與代碼一起存儲;每個可加載的公共語言運行庫可移植執(zhí)行 (PE) 文件都包含元數(shù)據(jù)。公共語言運行庫使用元數(shù)據(jù)來完成以下任務(wù):查找和加載類,在內(nèi)存中安排實例,解析方法調(diào)用,生成本機代碼,強制安全性,以及設(shè)置運行時上下文邊界

公共語言運行庫自動處理對象布局并管理對象引用,當不再使用對象時釋放它們。按這種方式實現(xiàn)生存期管理的對象稱為托管數(shù)據(jù)。垃圾回收消除了內(nèi)存泄漏以及其他一些常見的編程錯誤。如果您編寫的代碼是托管代碼,則可以在 .NET Framework 應(yīng)用程序中使用托管數(shù)據(jù)、非托管數(shù)據(jù)或者同時使用這兩種數(shù)據(jù)。由于語言編譯器會提供自己的類型(如基元類型),因此您可能并不總是知道(或需要知道)這些數(shù)據(jù)是否是托管的。

有了公共語言運行庫,就可以很容易地設(shè)計出能夠跨語言交互的組件和應(yīng)用程序。也就是說,用不同語言編寫的對象可以互相通信,并且它們的行為可以緊密集成。例如,可以定義一個類,然后使用不同的語言從原始類派生出另一個類或調(diào)用原始類的方法。還可以將一個類的實例傳遞到用不同的語言編寫的另一個類的方法。這種跨語言集成之所以成為可能,是因為基于公共語言運行庫的語言編譯器和工具使用由公共語言運行庫定義的通用類型系統(tǒng),而且它們遵循公共語言運行庫關(guān)于定義新類型以及創(chuàng)建、使用、保持和綁定到類型的規(guī)則。

所有托管組件都帶有生成它們所基于的組件和資源的信息,這些信息構(gòu)成了元數(shù)據(jù)的一部分。公共語言運行庫使用這些信息確保組件或應(yīng)用程序具有它需要的所有內(nèi)容的指定版本,這樣就使代碼不太可能由于某些未滿足的依賴項而發(fā)生中斷。注冊信息和狀態(tài)數(shù)據(jù)不再保存在注冊表中(因為在注冊表中建立和維護這些信息很困難)。取而代之的是,有關(guān)您定義的類型(及其依賴項)的信息作為元數(shù)據(jù)與代碼存儲在一起,這樣大大降低了組件復(fù)制和移除任務(wù)的復(fù)雜性。

通用類型系統(tǒng)定義了如何在運行庫中聲明、使用和管理類型,同時也是運行庫支持跨語言集成的一個重要組成部分。通用類型系統(tǒng)執(zhí)行以下功能:

  • 建立一個支持跨語言集成、類型安全和高性能代碼執(zhí)行的框架。
  • 提供一個支持完整實現(xiàn)多種編程語言的面向?qū)ο蟮哪P汀?
  • 定義各語言必須遵守的規(guī)則,有助于確保用不同語言編寫的對象能夠交互作用。

 

 

使用.NET Framework編寫應(yīng)用程序

使用.NET Framework編寫應(yīng)用程序意味著使用.NET Framework代碼庫編寫代碼(使用任何.NET Framework支持的語言)。本書使用VS和VCE作為開發(fā)環(huán)境。這些環(huán)境的優(yōu)點是能更好地將.NET的特征融入到代碼中。可以完全使用C#編寫代碼,但使用.NET Framework整個過程中,能根據(jù)需要使用VS和VCE的其他工具。

為了執(zhí)行C#代碼,必須把它們轉(zhuǎn)換為目標操作系統(tǒng)所能理解的語言,即本地代碼;這種轉(zhuǎn)換稱為編譯代碼,由編譯器執(zhí)行。然而在.NET Framework環(huán)境下,這個過程分為兩個階段。

MSIL和JIT

當編譯使用.NET Framework庫的代碼時,不是立即創(chuàng)建操作系統(tǒng)特定的本地代碼,而是將代碼編譯為微軟中間語言(Microsoft Intermediate Language,MSIL)代碼。這個代碼不專用于任何一種操作系統(tǒng),也不專用于C#語言的。其他.NET語言,諸如Visual Basic.NET也在第一階段編譯成MSIL代碼。

顯然,運行一個程序必須完成更多的工作,這就是即時編譯器(Just-in-Time,JIT),JIT編譯器將MSIL代碼編譯為特定的OS和目標機器體系結(jié)構(gòu)的本地代碼。只有完成這個步驟,操作系統(tǒng)才能運行程序。編譯器的名稱Just-in-Time,反映MSIL代碼僅在需要時才編譯這個事實。

在過去,編譯器常常把代碼編譯成幾個程序,每個程序都以特定的操作系統(tǒng)和CPU結(jié)構(gòu)體系為目標。常常,這是一種優(yōu)化形式(例如,為了代碼在AMD的CPU運行更快些),有時這是重要的(例如對于工作在Win9x和WinNT/2000環(huán)境的程序),現(xiàn)在就不必要了。因為JIT編譯器使用MSIL代碼,而MSIL代碼是與機器、操作系統(tǒng)和CPU無關(guān)的。存在不同的JIT編譯器,每個編譯器都針對不同的體系結(jié)構(gòu),根據(jù)需要總能找到一個合適的編譯器創(chuàng)建的本地代碼。

【MSDN】

托管執(zhí)行過程包括下列步驟:

  1. 選擇編譯器。

    為獲得公共語言運行庫提供的優(yōu)點,必須使用一個或多個針對運行庫的語言編譯器。

  2. 將代碼編譯為 Microsoft 中間語言 (MSIL)。

    編譯將源代碼翻譯為 MSIL 并生成所需的元數(shù)據(jù)。

  3. 將 MSIL 編譯為本機代碼。

    在執(zhí)行時,實時 (JIT) 編譯器將 MSIL 翻譯為本機代碼。在此編譯過程中,代碼必須通過驗證過程,該過程檢查 MSIL 和元數(shù)據(jù)以查看是否可以將代碼確定為類型安全。

  4. 運行代碼。

    公共語言運行庫提供使執(zhí)行能夠發(fā)生以及可在執(zhí)行期間使用的各種服務(wù)的結(jié)構(gòu)。

編譯為 MSIL

當編譯為托管代碼時,編譯器將源代碼翻譯為 Microsoft 中間語言 (MSIL),這是一組可以有效地轉(zhuǎn)換為本機代碼且獨立于 CPU 的指令。MSIL 包括用于加載、存儲和初始化對象以及對對象調(diào)用方法的指令,還包括用于算術(shù)和邏輯運算、控制流、直接內(nèi)存訪問、異常處理和其他操作的指令。要使代碼可運行,必須先將 MSIL 轉(zhuǎn)換為特定于 CPU 的代碼,這通常是通過實時 (JIT) 編譯器來完成的。由于公共語言運行庫為它支持的每種計算機結(jié)構(gòu)都提供了一種或多種 JIT 編譯器,因此同一組 MSIL 可以在所支持的任何結(jié)構(gòu)上 JIT 編譯和運行。

當編譯器產(chǎn)生 MSIL 時,它也產(chǎn)生元數(shù)據(jù)。元數(shù)據(jù)描述代碼中的類型,包括每種類型的定義、每種類型的成員的簽名、代碼引用的成員和運行庫在執(zhí)行時使用的其他數(shù)據(jù)。MSIL 和元數(shù)據(jù)包含在一個可移植可執(zhí)行 (PE) 文件中,此文件基于并擴展過去用于可執(zhí)行內(nèi)容的已公布的 Microsoft PE 和公共對象文件格式 (COFF)。這種文件格式包含 MSIL 或本機代碼以及元數(shù)據(jù),使得操作系統(tǒng)能夠識別公共語言運行庫映像。文件中的元數(shù)據(jù)以及 MSIL 的存在使代碼能夠描述自身,這意味著不再需要類型庫或接口定義語言 (IDL)。運行庫在執(zhí)行過程中根據(jù)需要從該文件中查找并提取元數(shù)據(jù)。

運行代碼

公共語言運行庫提供了使托管執(zhí)行能夠發(fā)生并提供可以在執(zhí)行期間使用的各種服務(wù)的結(jié)構(gòu)。在運行方法之前,必須先將其編譯為特定于處理器的代碼。當首次調(diào)用已經(jīng)為其生成 Microsoft 中間語言 (MSIL) 的每個方法,然后運行該方法時,該方法將是實時編譯的(JIT 編譯)。下次運行該方法時,將運行現(xiàn)有的 JIT 編譯的本機代碼。這種進行 JIT 編譯然后執(zhí)行代碼的過程一直重復(fù)到執(zhí)行完成時為止。

在執(zhí)行過程中,托管代碼接收若干服務(wù),這些服務(wù)涉及垃圾回收,安全性,與非托管代碼的互操作性,跨語言調(diào)試支持,增強的部署,以及版本控制支持等。

在 Microsoft Windows XP 和 Windows Vista 中,操作系統(tǒng)加載程序通過檢查通用對象文件格式 (COFF) 頭中的某個位來檢查托管模塊。所設(shè)置的位表示托管模塊。如果加載程序檢測到托管模塊,它將加載 mscoree.dll。_CorValidateImage 和 _CorImageUnloading 將分別在加載和卸載托管模塊時通知加載程序。_CorValidateImage 執(zhí)行下列操作:

  1. 確保代碼是有效的托管代碼。
  2. 將映像中的入口點更改為運行庫中的入口點。

在 64 位的 Windows 上,_CorValidateImage 會修改內(nèi)存中的映像,將其從 PE32 格式轉(zhuǎn)換為 PE32+ 格式。

 

 

程序集

當編譯程序時,創(chuàng)建MSIL代碼并存儲在程序集中。程序集包括可執(zhí)行的應(yīng)用程序文件(這些文件能直接在Windows上運行,不需要其他任何程序,其擴展名是.exe)和被其他應(yīng)用程序使用的庫(其擴展名是.dll)。

除了包含MSIL外程序集還包括元信息(即程序集中包含的數(shù)據(jù)信息,也稱為元數(shù)據(jù))和可選的資源(被MSIL額外使用的數(shù)據(jù),諸如聲音文件和圖片)。元信息允許程序集完全是自描述的。不需要其他信息就能使用程序集,意味著可以避免下列情形,諸如不能把需要的數(shù)據(jù)添加到系統(tǒng)注冊表等等,而這種情形在采用其他平臺開發(fā)時,這是經(jīng)常發(fā)生的。

這意味著部署應(yīng)用程序常常像把一個文件復(fù)制到遠程計算機上的目錄一樣簡單。因為沒有目標系統(tǒng)需要的附加信息,可以在目錄中直接運行這個程序(假設(shè)已安裝.NET CLR)。

當然沒有必要把運行一個程序所需的信息都安裝到同一個地方。可以寫一些代碼執(zhí)行多個應(yīng)用程序所需的任務(wù)?;谶@種情形,把可重用代碼存放在所有程序都能訪問到的地方是很有用的。在.NET Framework中,這個地方稱為全局程序集高速緩存(GAC)。將代碼存放在GAC中是簡單的,只需將程序集包含的代碼存放在包含高速緩存的目錄下即可。

 

【MSDN】

程序集是 .NET Framework 編程的基本組成部分。程序集執(zhí)行以下功能:

  • 包含公共語言運行庫執(zhí)行的代碼。如果可移植可執(zhí)行 (PE) 文件沒有相關(guān)聯(lián)的程序集清單,則將不執(zhí)行該文件中的 Microsoft 中間語言 (MSIL) 代碼。請注意,每個程序集只能有一個入口點(即 DllMain、WinMain 或 Main)。
  • 程序集形成安全邊界。程序集就是在其中請求和授予權(quán)限的單元。
  • 程序集形成類型邊界。每一類型的標識均包括該類型所駐留的程序集的名稱。在一個程序集范圍內(nèi)加載的 MyType 類型不同于在其他程序集范圍內(nèi)加載的 MyType 類型。
  • 程序集形成引用范圍邊界。程序集的清單包含用于解析類型和滿足資源請求的程序集元數(shù)據(jù)。它指定在該程序集之外公開的類型和資源。該清單還枚舉它所依賴的其他程序集。
  • 程序集形成版本邊界。程序集是公共語言運行庫中最小的可版本化單元,同一程序集中的所有類型和資源均會被版本化為一個單元。程序集的清單描述您為任何依賴項程序集所指定的版本依賴性。
  • 程序集形成部署單元。當一個應(yīng)用程序啟動時,只有該應(yīng)用程序最初調(diào)用的程序集必須存在。其他程序集(例如本地化資源和包含實用工具類的程序集)可以按需檢索。這就使應(yīng)用程序在第一次下載時保持精簡。
  • 程序集是支持并行執(zhí)行的單元。

程序集可以是靜態(tài)的或動態(tài)的。靜態(tài)程序集可以包括 .NET Framework 類型(接口和類),以及該程序集的資源(位圖、JPEG 文件、資源文件等)。靜態(tài)程序集存儲在磁盤上的可移植可執(zhí)行 (PE) 文件中。您還可以使用 .NET Framework 來創(chuàng)建動態(tài)程序集,動態(tài)程序集直接從內(nèi)存運行并且在執(zhí)行前不存儲到磁盤上。您可以在執(zhí)行動態(tài)程序集后將它們保存在磁盤上。

有幾種創(chuàng)建程序集的方法。您可以使用過去用來創(chuàng)建 .dll 或 .exe 文件的開發(fā)工具,例如 Visual Studio 2005。您可以使用 Windows 軟件開發(fā)工具包 (SDK) 中提供的工具來創(chuàng)建帶有在其他開發(fā)環(huán)境中創(chuàng)建的模塊的程序集。您還可以使用公共語言運行庫 API(例如 Reflection.Emit)來創(chuàng)建動態(tài)程序集。

 

托管代碼

當把代碼編譯成MSIL,并利用JIT編譯器將MSIL代碼編譯成本地代碼之后,CLR并沒有結(jié)束。當使用.NET Framework編寫的代碼在執(zhí)行時(這個階段通常稱為運行時)是被托管的。這意味著CLR負責管理程序,其方式是管理內(nèi)存、處理安全、允許跨語言調(diào)試等等。反之,應(yīng)用程序沒有在CLR控制下運行稱為非托管,某些語言諸如C++能編寫這樣的應(yīng)用程序,例如訪問操作系統(tǒng)底層的功能。然而,在C#中只能編寫在托管環(huán)境下運行的代碼。我們將使用CLR提供的托管功能,并且由.NET自己處理與操作系統(tǒng)之間的交互。

垃圾回收

托管代碼最重用的一個功能是垃圾回收。這種.NET方法確保應(yīng)用程序不再使用某些內(nèi)存時,這些內(nèi)存就會完全被釋放。在.NET推出之前,這是程序員的職責。代碼中少量的簡單錯誤會將大的內(nèi)存塊分配到錯誤的地方,導(dǎo)致這些內(nèi)存神秘消失。這通常意味著計算機運行速度逐漸減慢而最終系統(tǒng)崩潰。

.NET垃圾回收頻繁檢測計算機內(nèi)存,回收長時間未使用的內(nèi)存空間。這是沒有設(shè)置時間幀,它可以在一秒中檢測幾千次,也可以幾秒鐘才檢測一次或者任意時刻檢測,但可以肯定進行了檢查。

這里要給程序員一些提示。因為這項工作是在不可預(yù)知的情況下進行的,因此程序設(shè)計時應(yīng)該考慮這一點。需要很多的內(nèi)存才能運行的程序應(yīng)該能自己檢查,而不是坐等垃圾回收,但聽起來并不是很難的。

 

【MSDN】

垃圾回收

.NET Framework 的垃圾回收器管理應(yīng)用程序的內(nèi)存分配和釋放。每次您使用 new 運算符創(chuàng)建對象時,運行庫都從托管堆為該對象分配內(nèi)存。只要托管堆中有地址空間可用,運行庫就會繼續(xù)為新對象分配空間。但是,內(nèi)存不是無限大的。最終,垃圾回收器必須執(zhí)行回收以釋放一些內(nèi)存。垃圾回收器優(yōu)化引擎根據(jù)正在進行的分配情況確定執(zhí)行回收的最佳時間。當垃圾回收器執(zhí)行回收時,它檢查托管堆中不再被應(yīng)用程序使用的對象并執(zhí)行必要的操作來回收它們占用的內(nèi)存。

 

組合在一起

在繼續(xù)學習之前,先把前面介紹的創(chuàng)建一個.NET Framework應(yīng)用程序所需的步驟總結(jié)一下:

  1. 應(yīng)用程序采用與.NET兼容的語言(如C#)編寫代碼。

  2. 代碼編譯成MSIL,并存儲在程序集中。

  1. 當代碼執(zhí)行時(如果它是一個可執(zhí)行文件則自動運行,或者當其他代碼調(diào)用它時運行),代碼必須首先使用JIT編譯器編譯為本機代碼。

  2. 在托管的CLR環(huán)境中運行本機代碼和其他任意的應(yīng)用程序或進程。

 

鏈接

在上述過程中還要注意一點。在第二步驟中編譯成MSIL時C#代碼不一定被合并到一個文件中,可以把應(yīng)用程序代碼分割成多個源代碼文件,再把它們編譯到一個程序集中。這個非常有用的過程成為鏈接。這是因為處理幾個文件比處理一個巨大的文件簡單得多??梢詫⑦壿嬌舷嚓P(guān)的代碼分離到一個單獨的文件,因此能單獨處理,也更容易在需要時找到它們,讓團隊的開發(fā)人員將程序工作分解為易管理的模塊,借此每個人可以單獨編寫一個代碼塊,而不會冒著破壞其他已完成的部分或其他人正在處理的部分的危險。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
C#技術(shù)漫談之公共語言運行庫(CLR)
.NET Framework 和 c# 簡介
常用的.NET面試問題 - 1
全面認識.NET框架(一)
.NET Framework 概述
.net Framework版本
更多類似文章 >>
生活服務(wù)
熱點新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服