2017-11-18 185 views
0

我可以看到這裏CIL指令列表:CIL如何使用網絡/ http請求?

https://en.wikipedia.org/wiki/List_of_CIL_instructions

我的理解是,CIL在CLR運行。但是,我看不出有任何這些指令可以用來發出一個http請求(這在CLR中顯然是可行的)。

沒有任何代碼似乎是關於獲取外部信息。

我錯過了什麼?

+3

您需要了解抽象如何工作。計算機無法做任何事情,除了加,減,乘,除以及周圍的數字。這不是Web請求的CLR,而是基礎類庫中的數千條指令。 –

+0

英特爾/ AMD處理器中也沒有「make HTTP request」命令。所以沒有人可以做出HTTP請求。永遠。抱歉。您必須使用Blackberry,因爲我們不知道他們是否擁有CPU :) –

+0

「CIL如何獲取外部信息」本身就是一個很好的問題。也許這可以重新改寫,看起來更好。 – IllidanS4

回答

3

它也沒有指示創建文件。你有一點要注意,用普通的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代碼與系統或運行時進行交互的唯一合法方式。

5

我錯過了什麼?

你的邏輯鏈條是這樣的:

  • 所有類型的所有CLR方法用的CIL指令序列來實現
  • CIL指令只能執行某些任務
  • 有些任務需要在CIL中找不到說明的組合。
  • 因此,某些任務在CLR方法中是不可能的。

然後您注意到結論是錯誤的,並且正確地注意到該邏輯鏈中的其中一個步驟必須是錯誤的。

錯誤的是第一個。沒有要求通過一大堆CIL實現一個方法,然後將其分解爲本機代碼。特別是用extern修飾符標記的C#方法是通過將控件傳遞給聲明中提到的(推測爲非託管代碼)DLL來實現的。因此,用CLR管理之外的其他語言編寫的代碼可以從運行在CLR下的程序中調用。