我可以看到這裏CIL指令列表:CIL如何使用網絡/ http請求?
https://en.wikipedia.org/wiki/List_of_CIL_instructions
我的理解是,CIL在CLR運行。但是,我看不出有任何這些指令可以用來發出一個http請求(這在CLR中顯然是可行的)。
沒有任何代碼似乎是關於獲取外部信息。
我錯過了什麼?
我可以看到這裏CIL指令列表:CIL如何使用網絡/ http請求?
https://en.wikipedia.org/wiki/List_of_CIL_instructions
我的理解是,CIL在CLR運行。但是,我看不出有任何這些指令可以用來發出一個http請求(這在CLR中顯然是可行的)。
沒有任何代碼似乎是關於獲取外部信息。
我錯過了什麼?
它也沒有指示創建文件。你有一點要注意,用普通的CIL,一些任務根本無法完成。打開套接字,寫入磁盤,在屏幕上繪圖等任務不能由單個CIL指令完成,也不能完全分解成這些指令。
x86彙編代碼中有沒有說明發揮使用PC的揚聲器發出聲音,但它顯然可以使用它(不是一個完整的例子)來完成:
mov al, 0x36
out 0x43, al
mov ax, 11931
out 0x40, al
mov al, ah
out 0x40, al
這裏,out
可以用來寫一個值給CPU特定的端口。這是與「外部世界」溝通的一種方式。在這種情況下,CPU儘可能最好地運行和解釋代碼,並且它只是瞭解端口號碼的含義。它可以與串口進行通信,或者在某個地方簡單地改變電壓,但此時我們會遇到硬件,所以這裏不再有「指令」,只是電力。
CIL沒有out
操作碼,因爲這會非常不安全且無法驗證。相反(這可能是你所要求的),它有方法的代碼實現屬性來指定在哪裏尋找特定方法的實現。
ImplAttr :: = ... | cil |原生 |運行時間
這些屬性是互斥的;他們指定了該方法包含的代碼的類型。
cil指定方法體由cil代碼組成。除非方法被聲明爲抽象,如果使用cil,則應提供方法的主體。
本地指定使用本機代碼實現一種方法,該方法綁定到它生成的 的特定處理器。 本地方法不應該有一個主體,而應該指代一個本機方法,即 聲明主體。通常,CLI的PInvoke功能用於引用本機方法。
運行時指定該方法的實現由運行時自動提供,主要用於委託方法。 (ECMA-335)
標有cil
方法應具有體由CIL操作碼,native
應提示身體處於位於某處原生指令,並runtime
離開執行法的任務運行時間。像往常一樣,call
操作碼用於調用這些方法。
這樣的方法的一個例子:
.method assembly hidebysig static pinvokeimpl("kernel32.dll" autochar lasterr winapi bestfit:off)
bool DeleteFile(string path) cil managed preservesig
{
}
出於某種原因,ILDASM顯示cil managed
這是在根據ECMA-335 pinvokeimpl
直接衝突。它應該是native unmanaged
,我不確定爲什麼ildasm會顯示此內容。
調用外部方法的機制是P/Invoke,QCall和FCall。關於它們的好信息可以在here找到。這是CIL代碼與系統或運行時進行交互的唯一合法方式。
我錯過了什麼?
你的邏輯鏈條是這樣的:
然後您注意到結論是錯誤的,並且正確地注意到該邏輯鏈中的其中一個步驟必須是錯誤的。
錯誤的是第一個。沒有要求通過一大堆CIL實現一個方法,然後將其分解爲本機代碼。特別是用extern
修飾符標記的C#方法是通過將控件傳遞給聲明中提到的(推測爲非託管代碼)DLL來實現的。因此,用CLR管理之外的其他語言編寫的代碼可以從運行在CLR下的程序中調用。
您需要了解抽象如何工作。計算機無法做任何事情,除了加,減,乘,除以及周圍的數字。這不是Web請求的CLR,而是基礎類庫中的數千條指令。 –
英特爾/ AMD處理器中也沒有「make HTTP request」命令。所以沒有人可以做出HTTP請求。永遠。抱歉。您必須使用Blackberry,因爲我們不知道他們是否擁有CPU :) –
「CIL如何獲取外部信息」本身就是一個很好的問題。也許這可以重新改寫,看起來更好。 – IllidanS4