CLR基礎,CLR運行過程,使用dos命令創建、編譯、運行C#文件,查看IL代碼

CLR是Common Language Runtime的縮寫,是.NET程序集或可執行程序運行的一個虛擬環境。CLR用于管理托管代碼,但是它本身是由非托管代碼編寫的,并不是一個包含了托管代碼的程序集,所以不能使用IL DASM進行查看,但CLR以dll的形式位于.NET版本號文件夾內。

?

□ C#源代碼從編譯到CLR運行的全過程

→編寫C#源代碼,以class,struct,enum,interface,delegate...的形式


→編譯器把源代碼編譯成.dll或.exe,其中包含了一些重要信息

?

PE/COFF頭:
它是Portable Executable/Common Object File Format的縮寫,Windows操作系統之所以能加載.dll或運行.exe就是因為.dll或.exe包含PE/COFF頭。Windows本身的應用程序帶有Windows PE,而用.NET開發的程序集或可執行程序帶有.NET PE,如果是Windows PE,操作系統執行該應用程序,如果是.NET PE,就交給CLR運行時來執行。

?

CLR頭:
告訴操作系統這個PE/COFF頭是一個.NET程序集,隨之把CLR的編譯環境運行起來。

?

清單:
描述程序集本身的信息,比如名稱、版本、文化、程序集包含的資源、組成程序集的文件等。

?

元數據:
描述程序集包含的內容,比如程序集包含的模塊、類型、類型成員的可見性(public, private,protected等)。查看元數據的過程叫反射。

?

CIL代碼:
也就是元數據中類型的實現,包括方法體、字段等。

?

資源文件:
例如圖片資源等。

?

→當點擊某個可執行程序,操作系統檢查PE頭,創建一個進程用于加載CLR,隨之檢查CLR頭,如果存在,就會加載位于System32下的mscoree.dll這個組件,調用其中的CoreExeMain()函數,該函數會加載合適的CLR版本,CLR正式開始運行。

?

→CLR中有一個Class Loader組件負責從GAC、配置文件、程序集元數據中尋找與Main()方法相關的類型,并把這些信息全部緩存起來,并且會為某個方法插入一個存根。

?

→CLR找到程序的入口點,通常是Main()方法開始執行。

?

→CLR驗證類型是否安全,校驗元數據是否正確,CIL代碼是否是類型安全的。

?

→CLR即時編譯,也就是通常所說的JIT編譯,將托管的CIL代碼編譯成機器代碼。還記得在加載類型的時候為每個方法插入一個存根嗎?在JIT即時編譯的時候,會檢測每個方法的存根,如果存根的內容為空,就執行JIT即時編譯。當再次調用該方法時,會再次檢查存根,如果發現存根保存了本地機器代碼的地址,就無需對該方法進行JIT即時編譯。

?

當然,CLR的職責不止這些,其它的還包括內存管理、線程管理、垃圾回收等。


□ 使用"VS2012開發人員命令提示"創建、編譯、運行文件,并查看IL代碼

→在C盤創建demo文件夾,在demo中創建managed-code文件夾


→點擊"開始"--"所有程序"--"Microsoft Visual Studio 2012"--"Visual Studio Tools"--"VS2012開發人員命令提示"


→在dos命令窗口輸入如下命令,并按回車
1


→關閉dos命令窗口,發現在managed-code文件夾中多兩個一個hello.cs文件


→重新打開"VS2012開發人員命令提示",輸入如下命令
2

?

○ csc hello.cs用來編譯文件
○ dir /b用來顯示文件夾中的內容
○ 直接輸入hello,用來運行hello.exe可執行文件

?

→再輸入如下命令,并按回車
3


→彈出IL DASM窗口,用來查看IL代碼
4


→雙擊"Main:void()"這個靜態方法,可以看到相關IL代碼。而中間IL代碼是被CLR用來執行的。
5

?

轉載于:https://www.cnblogs.com/darrenji/p/3957063.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/248239.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248239.shtml
英文地址,請注明出處:http://en.pswp.cn/news/248239.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

表單的全選取消全選

<div class"wrap"><table border"1" cellspacing"0" cellpadding"0"><caption>恭喜發財</caption><thead><tr><th><input type"checkbox" id"j_cbAll" checked&quo…

VUE 數據綁定模塊渲染 computed(實現通過路由id 查詢數據json結構,對應的值來放在面包屑中)...

異步請求的值放在vuex中&#xff0c;然后頁面掛載該數據和渲染頁面 computed 計算屬性是基于它的依賴緩存的。計算屬性在它的相關依賴發生改變時會重新取值&#xff0c;所以當ajax請求回來的數據發生變化時&#xff0c;計算屬性的值會進行更新&#xff0c;相關的模板引用也會重…

ThinkJs筆記瑣碎

ThinkJs筆記瑣碎 記錄一些瑣碎的在使用ThinkJs遇到的問題 靜態資源訪問 ThinkJs默認production環境關閉對www下資源的相對路徑的訪問&#xff0c;官方建議通過nginx轉向的地址的絕對路徑訪問&#xff0c;想要在production環境訪問相對路徑的話需要到src/config/middleware.js里…

js(Dom+Bom)第二天(1)

JavaScript-DOM操作 核心知識點 className操作標簽樣式style屬性方式操作標簽樣式操作表單控件 學習目標 能夠通過className方式給標簽設置樣式能夠通過style方式給標簽設置樣式能夠獲取表單控件中的值 操作元素樣式 語法&#xff1a;1.dom.className 類名;2.dom.style.屬…

HDU 4339 Query

算法: 比賽時沒有想到好的算法&#xff0c;暴力是O&#xff08; Q * N &#xff09;肯定超時。 賽后&#xff0c;線段樹&#xff0c;樹狀數組&#xff0c;HASH都能AC&#xff0c;想了下&#xff0c;的確用樹狀數組 時間復雜度就可以優化到O&#xff08;Q * lgN * lgN) 2000msAC…

201904快速閱讀術

在看過了幾本數之后&#xff0c;發現原來培養讀書的習慣好像也不太難&#xff0c;“將讀書融入生活&#xff0c;框定讀書時間” 生活中&#xff0c;我確實也是這樣執行了。利用每天上下班的時間聽書&#xff0c;有些覺得可以讀快的書籍用了1.5倍速度在聽&#xff0c;難懂的部分…

js(Dom+Bom)第二天(2)

webAPI 00-操作圖片 知識點-獲取圖片src屬性 圖片對象.src ----> 獲取圖片路徑注意: 1. 獲取到的圖片路徑是一個絕對路徑知識點-動態的給圖片標簽設置路徑 圖片對象.src 圖片路徑;注意: 1.可以設置絕對路徑(不推薦) 2.可以設置相對路徑課堂案例-切換圖片案例 01-操作標…

javaScript今日總結

javascript簡單介紹ECMAScript 1.語法 2.變量&#xff1a;只能使用var定義&#xff0c;如果在函數的內容使用var定義&#xff0c;那么它是一個局部變量&#xff0c;如果沒有使用var它是一個全局的。弱類型&#xff01; 3.數據類型&#xff1a;原始數據類型(undefined/null/stri…

使用Connector / Python連接MySQL/查詢數據

使用Connector / Python連接MySQL connect()構造函數創建到MySQL服務器的連接并返回一個 MySQLConnection對象 在python中有以下幾種方法可以連接到MySQL數據庫&#xff1a; 1.使用connect&#xff08;&#xff09;構造函數import mysql.connectorcnx mysql.connector.connect…

最簡方式 表格編輯 基于 el-table

共下面5點1.新增一個顯示和隱藏的參數2.在顯示那邊新增一個input框&#xff0c;用v-model綁定數據&#xff0c;用v-if來顯示和隱藏3.給之前的顯示的span標簽添加v-else 和上面形成if else4.編輯和保存按鈕同理&#xff0c;然后編輯按鈕觸發的任務將所有輸入打開。即seen置為tru…

js(Dom+Bom)第三天(1)

JavaScript-DOM 節點的層次結構 hasChildNodes() 【父元素中是否包含子節點】 dom.hasChildNodes() 總結&#xff1a;1.該方法返回的是一個布爾類型的結果用來判斷當前元素中是否存在子節點。2.該方法會將元素中所有的節點都獲取&#xff08;包括空格&#xff0c;回車符&#…

Spring Boot 自動配置原理

自動配置原理配置文件到底能寫什么&#xff1f;怎么寫&#xff1f;自動配置原理&#xff1b; 參考&#xff1a;https://docs.spring.io/spring-boot/docs/1.5.9.RELEASE/reference/htmlsingle/#common-application-properties配置文件能配置的屬性參照1、自動配置原理&#xff…

這 4 款實用小工具,能讓你的電腦變得好用又騷氣

在日常生活中&#xff0c;我們總會遇到一些重復又繁瑣的工作&#xff0c;它們不僅容易令人煩躁&#xff0c;也極大拖累了咱們的效率。其實&#xff0c;咱們完全可以通過一些工具提升效率&#xff0c;為自己節約出大量時間來干別的~今天就再給大家推薦 4 個免費的 Windows 平臺的…

js(Dom+Bom)第三天(2)

webAPI 0-操作標簽屬性 系統屬性 作用: 1. 可以操作標簽身上的任何一個系統中的自帶屬性 (id, class, name ....) 2. 還可以操作用戶自定義的屬性dom.getAttribute(屬性名)&#xff1b; 作用: getAttribute(屬性名) 方法 就是用來獲取標簽身上屬性的備注: 1. getAttribute() 方…

xshell使用指南

shell使用指南 ZMODEM功能 yum install lrzsz rz 上傳 sz 下載 快捷鍵 alt o 打開終端 alt 1-9 切換 ctrl alt 切換 ctrl shift n 打開新選項卡 vim的小鍵盤不能使用的問題 在會話的屬性中&#xff0c;將VT模式的初始數字鍵盤設置為普通 配色方案 保存成xcs文件&#xff0c…

C#Socket編程詳解(一)TCP與UDP簡介

一、TCP與UDP&#xff08;轉載&#xff09; 1、TCP 1.1 定義 TCP&#xff08;TransmissionControl Protocol&#xff09;傳輸控制協議。 是一種可靠的、面向連接的協議&#xff08;eg:打電話&#xff09;、傳輸效率低全雙工通信&#xff08;發送緩存&接收緩存&#xff09;、…

動態創建表格數據

<input type"button" value"創建"><style>*{margin: 0;padding: 0;}table{width: 980px;margin: 50px auto;}table,th,tr,td{text-align: center;border: 1px solid #ccc;}</style><script>var heads [姓名, 年齡, 性別, 學號, 薪…

第四節:EF Core的并發處理

1.說明 和EF版本的并發處理方案一致&#xff0c;需要知道樂觀并發和悲觀并發的區別&#xff0c;EF Core只支持樂觀并發&#xff1b;監控并發的兩種方案&#xff1a;監測單個字段和監測整條數據&#xff0c;DataAnnotations 和 FluentApi的兩種配置方式。 &#xff08;PS&#x…

js(Dom+Bom)第四天(1)

webAPI 1-通過DOM節點方式獲取元素 1-0注意事項 下面的內容都在在文檔樹上直接操作的 (節點 元素)重點是: 與元素相關的內容1-1與父節點相關的操作方式 1-1-1.知識點-判斷父元素中是否有子節點 語法: DOM.hasChildNodes();總結: 該方法返回的是一個布爾類型的結果該方法會…

vue官方eslint插件配置eslint-plugin-vue-libs

由于eslint-config-vue已經被廢棄&#xff0c;于是總結了一下eslint-plugin-vue-libs的eslint config配置&#xff0c;如下&#xff1a; module.exports {extends: [plugin:vue/essential],plugins: [vue-libs],parserOptions: {parser: require.resolve(babel-eslint),ecmaVe…