[.NET] CLR

公共語言運(yùn)行時(shí)(CLR),是一個(gè)可由多種編程語言使用的“運(yùn)行時(shí)”。包括,內(nèi)存管理,程序集加載,安全性,異常處理和線程同步,它們可以由面向CLR的所有語言使用。在運(yùn)行時(shí),CLR根本不關(guān)心開發(fā)人員用哪一種語言來寫源代碼。

微軟已經(jīng)創(chuàng)建了好幾個(gè)面向CLR的語言編譯器,包括,C++/CLI,C#,Visual Basic,F(xiàn)#,Iron Python,Iron Ruby以及一個(gè)中間語言(IL)匯編器。除了微軟,另一些公司,學(xué)院和大學(xué)也創(chuàng)建了自己的編譯器,它們也能面向CLR來生成代碼。

無論使用哪一種編譯器,結(jié)果都是一個(gè)托管模塊,它是一個(gè)標(biāo)準(zhǔn)的PE32文件或PE32+文件。托管模塊由4部分組成,PE32或PE32+頭,CLR頭,元數(shù)據(jù),中間語言(IL)代碼

本地代碼編譯器生成的是面向特定CPU架構(gòu)的代碼,而每個(gè)面向CLR的編譯器生成的都是IL代碼。IL代碼有時(shí)稱為托管代碼,因?yàn)镃LR要管理它的執(zhí)行。

高級(jí)語言通常只公開了CLR所有功能的一個(gè)子集。然而,IL匯編語言允許開發(fā)人員訪問CLR的所有功能。

為了執(zhí)行包含托管代碼或者托管數(shù)據(jù)的模塊,最終用戶必須在自己的計(jì)算機(jī)上安裝CLR(.NET Framework的一部分)。C++編譯器比較特殊,只有它才允許開發(fā)人員同時(shí)寫托管和非托管代碼,并生成到同一個(gè)模塊中
C++編譯器默認(rèn)生成包含非托管(本地)代碼的EXE/DLL模塊,并在運(yùn)行時(shí)操縱非托管數(shù)據(jù)(本地內(nèi)存),這些模塊不需要CLR即可運(yùn)行。然而,制定一個(gè)/CLR命令行開關(guān)后,C++編譯器就能生成包含托管代碼的模塊。當(dāng)然,最終用戶必須安裝CLR才能執(zhí)行這種代碼。
只有C++編譯器允許開發(fā)人員在源代碼中同時(shí)定義托管和非托管數(shù)據(jù)類型,允許開發(fā)人員在托管代碼中使用他們現(xiàn)有的本地C/C++代碼,并在逐漸習(xí)慣之后開始使用托管類型。

程序集(Assembly)是一個(gè)或多個(gè)模塊或資源文件的邏輯分組。在CLR的世界中,程序集相當(dāng)于一個(gè)“組件”。
CLR操作的邏輯單元就是程序集,在程序集的所有文件中,有一個(gè)文件容納了清單(manifest)。清單是一組元數(shù)據(jù)表的集合,表中主要包含了作為程序集的組成部分的那些文件的名稱。此外,它們還描述了程序集的版本,語言文化,發(fā)布者,公開導(dǎo)出類型以及構(gòu)成程序集的所有文件。
CLR總是首先加載包含“清單”元數(shù)據(jù)表的文件,再根據(jù)這個(gè)“清單”來獲取程序集中的其他文件的名稱。
程序集是可以由多個(gè)文件構(gòu)成的,一些是含有元數(shù)據(jù)的PE文件,另一些是.gif或.jpg這樣的資源文件。為了便于理解,可將程序集視為一個(gè)邏輯EXE或DLL。程序集將可重用類型的邏輯表示與物理表示分開了,程序集是進(jìn)行重用,版本控制和應(yīng)用安全性設(shè)置的一個(gè)基本單元。

遺憾的是,不能直接從Visual studio集成開發(fā)環(huán)境中創(chuàng)建多文件程序集。要?jiǎng)?chuàng)建多文件程序集,只能使用命令行工具。

命令行創(chuàng)建多文件程序集的例子:
假定有兩個(gè)源代碼文件,RUT.cs包含不常用的類型,F(xiàn)UT.cs包含常用的類型。

csc /t:module RUT.cs

C#編譯器將編譯RUT.cs,創(chuàng)建名為RUT.netmodule的標(biāo)準(zhǔn)PE文件,但是CLR不能單獨(dú)加載它。

csc /out:JeffTypes.dll /t:library /addmodule:RUT.netmodule FUT.cs

C#編譯器將編譯FUT.cs,來生成JeffTypes.dll。由于指定了/t:library開關(guān),所以生成的JeffTypes.dll是包含了清單元數(shù)據(jù)表的一個(gè)PE文件。/addmodule:RUT.netmodule開關(guān)告訴編譯器,RUT.netmodule這個(gè)文件應(yīng)被視為程序集的一部分。

名稱空間完全獨(dú)立于程序集,一個(gè)程序集中可以有不同的名稱空間,同一個(gè)名稱空間也可以分布在不同的程序集上。盡管程序集包含相同的名稱空間,但沒有相同的類名。

在開發(fā)期間,添加對(duì)程序集的引用,使之包含在程序集引用中,該類型的程序集就可以用于編譯器。運(yùn)行期間,只要實(shí)例化了一種類型的程序集,或者使用了該類型的一個(gè)方法,就會(huì)加載所引用的程序集。
除了這種自動(dòng)操作之外,還可以通過編程加載程序集。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,641評(píng)論 19 139
  • 分享人:傅云特邀嘉賓: 周振濤 原文出處: 鏈接:https://bbs.kafan.cn/thread-20...
    胡諾閱讀 1,486評(píng)論 0 0
  • 昨天同事在部門分享中談到了Android的虛擬機(jī)機(jī)制。正好想到我在學(xué)習(xí).Net CLR的時(shí)候研究過CLR運(yùn)行時(shí)的相...
    danejahn閱讀 1,143評(píng)論 1 51
  • 基礎(chǔ) .NET概述 參考:http://www.cnblogs.com/yplong/p/3279934.html...
    donite閱讀 1,732評(píng)論 0 8
  • 我尋著你的背影走過你走過的路看你看過的風(fēng)景抬起頭你的身影消失不見無人可再讓我追逐那么我便成為你的影子拼盡一生去守護(hù)...
    約定星空閱讀 330評(píng)論 0 4

友情鏈接更多精彩內(nèi)容