2016-01-16 35 views
5

當通過P/Invoke通過顯式的64位.NET應用程序與64位本機庫進行交互時,DllImport屬性中的CallingConvention屬性會被有效忽略?是否在64位.NET應用程序中忽略了CallingConvention?

我問這個是因爲在「傳統」的x86你必須說明呼叫者或被叫方清理堆棧變量的方式(以及如何函數本身可能使用某些CPU寄存器等);但據我所知,x64只有一個約定,__fastcall(儘管最近增加了__vectorcall)。

因此,無論您爲CallingConvention屬性設置什麼,CLR都會繼續執行函數調用和__fastcall x64約定嗎?

回答

9

是的,完全忽略。 64位pinvoke編組僅支持x64 ABI,鬆散地基於__fastcall。非常鬆散。如果您指定CallingConvention,您將不會遇到異常情況,它只是聳聳肩。

請注意,__vectorcall不是特定於x64,還有一個x86變體。 pinvoke編組都不支持,你必須編寫一個C++/CLI包裝器。支持它的意義不大,.NET抖動仍然對SSE2/AVX支持非常弱。在System.Numerics.Vector一丁點與RyuJIT抖動,與VS2015發貨,但沒有在附近能參數傳遞給方法,但新的x64抖動。嚴酷的對齊要求將需要一個非常激烈的CLR重寫,長途未來的音樂。

相關問題