net框架運行原理
核心是CLR(通用語言運行時),
c#或者其它各種語言編譯原理:將原代碼通過相對的編譯器(語法檢查原代碼分析)生成IL代碼托管(IL也稱托管代碼),最后得到一個托管模塊,一個或多個托管模塊組成程序集(assembly)交給CLR運行;
編譯器需要為托管模塊生成完整的元數據;
元數據:是一個數據表集合,其中有描述托管模塊中引用類型和成員的,還有一些描述他們中成員類型和定義的,元數據和代碼一起被嵌入到EXE或者DLL中;
因此編譯器同時產生元數據和IL代碼,並且將它們嵌入到生成的托管模塊中;
元數據在.net中的作用:
元數據省去了源代碼編譯時對頭文件和庫文件的需求,編譯器可以直接從托管模塊中取元數據來獲得代碼中包含哪些成員和所有被引用的類型;
用元數據輔助我們編寫代碼,.net的智能感知特性是通過分析元數據來概述我們某個類型提供了哪些方法,以及方法有哪些參數;
CLR代碼驗證可以用元數據確保執行的安全性;
通過元數據垃圾收集器可以追蹤對象的生存期;
程序集中有一些托管模塊和資源文件,通過CLR處理后在內部得到所有文件的邏輯組合關系,得到一個清單數據塊,這些內容描述了組成程序集的文件;注意:程序集中還包含它所引用的其它程序集的一些信息,這些信息可以使程序集實現自描述,這樣也就讓CLR的執行不再到注冊表中取,因此讓程序集的部署要比非托管組件的部署容易得多;
安裝VS08,其主要就是CLR的安裝,CLR負責管理包含在程序集中的代碼執行;系統文件中的mscoree.dll就代表了本機裝了.NET框架;由此,我們也就知道Winform開發對於宿主機器會有.NET框架要求,因此打包安裝包時要注意添加.netFrameWork作為附件安裝;
當生成的是一個EXE程序集,會在編譯中產生一些特殊的信息,CLR在加載程序集的時候江通過這些信息定位到應用程序的入口點方法,這樣就啟動了應用程序;注意非托管程序如果調用托管程序集,托管程序集DLL的入口函數也會去讓CLR來處理包含在其中的代碼;
mscoree.dll是負責執行程序集,指示引導如何運行.NET框架下的托管程序,
C#是高級編程語言,IL是機器語言,但不同與一般機器語言,它擁有很多高級指令,IL描述上應該講是面向對象的機器語言;
IL匯編器ILAsm.exe 反匯編器ildasm.exe
混淆器obfuscator,而對於知識產權的保護一是盡量讓托管程序和模塊留在公司服務器上,向外發布就需要靠混淆器保護,另外如果混淆器還不夠,就只能將一些敏感算法通過非托管模塊實現;
CLR的介紹
最大的特點允許編程語言混編集成,c#的I/O能力突出,APL側重高級工程及金融計算;
CLI(開發通用語言基礎構造),CLI定義了文件格式,通用類型系統,可擴展元數據系統,中間語言和對平台底層的訪問共五項標准;
CLR不能直接執行IL代碼,IL代碼還需要通過JIT即時編譯器轉換成CPU指令;
CLR的工作方式:檢測代碼中引用到的所有類型,分配一個內部數據結構來管理引用類型的訪問;當有方法被調用時代碼被即時編譯驗證並轉換成CPU指令,並動態保存在內存中;這樣,一個方法只有在首次調用時,才會產生一些性能損失,后續調用時不再進行驗證轉換,而命令CPU做全速執行。
微軟對性能做了大量的壓縮工作,因此編譯器轉換首次調用時性能損耗微乎其微;
FCL(.net框架類庫程序集)
CTS(通用類型系統)一個關於類型的正式規范,描述了方法、屬性和事件的定義,以及類型可見性和訪問類型成員的規則;
CTS建立了以程序集作為類型可見性邊界的規則;
IDE集成開發環境(VS.NET)自身不支持多文件程序集,(必須通過命令行工具)