Dot-Net

[DllImport(‘QCall’)] 是什麼?

  • February 28, 2012

.Net 庫中的許多方法都是在本機程式碼中實現的。來自框架本身的那些都標有[MethodImpl(MethodImplOptions.InternalCall)]。來自某些非託管 DLL 的那些都標有[DllImport](例如[DllImport("kernel32.dll")])。到目前為止沒有什麼異常。

但是在為另一個問題寫答案時,我發現有很多方法標記為[DllImport("QCall")]。它們似乎是.Net 的內部實現(例如GC._Collect())。

我的問題是:到底是什麼[DllImport("QCall")]意思?[DllImport("QCall")]和 和有什麼不一樣[MethodImpl(MethodImplOptions.InternalCall)]

這是一種舊構想。由於 CoreCLR 現在在 GitHub 上開源;如果有人仍在尋找答案,這裡是官方文件

從託管程式碼呼叫本機程式碼

我們有兩種從託管程式碼呼叫 CLR 的技術。FCall 允許您直接呼叫 CLR 程式碼,並且在操作對象方面提供了很大的靈活性,儘管由於不正確跟踪對象引用很容易導致 GC 漏洞。QCall 允許您通過 P/Invoke 呼叫 CLR,並且比 FCall 更難意外誤用。FCall 在託管程式碼中被標識為設置了 MethodImplOptions.InternalCall 位的外部方法。QCalls 是靜態外部方法,看起來像正常的 P/Invokes,但用於名為“QCall”的庫。

FCall 有一個稱為 HCall(用於 Helper 呼叫)的小變體,用於實現 JIT 助手,用於執行訪問多維數組元素、範圍檢查等操作。HCall 和 FCall 之間的唯一區別是 HCall 方法不會顯示在異常堆棧跟踪中。

然後在小標題中繼續:

舉個例子:

我向 .Net 團隊中的一些人詢問了這個問題。

QCall 是對 CLR 執行時內的本地方法的呼叫。它們的行為與其他[DllImport]s 類似,但它們更快,因為它們對本機方法的作用做出特定(未記錄的)假設,因此它們可以跳過各種編組和 GC 以及異常檢查。

InternalCall是不同的; 它用於呼叫在執行時生成的特殊反射式事物(這不是很清楚)。

引用自:https://stackoverflow.com/questions/9491337