Dot-Net

在 Win32 / COM 方法上呼叫 PInvoke 時通常會出現明顯的性能損失嗎?

  • April 8, 2011

我想知道是否有人對使用 DLLImport / PInvoke 對託管 .Net 程式碼的 Win32 方法的負面方面有一個體面的解釋或概述?

我計劃使用各種 Win32 方法,並希望對這樣做的負面影響有更深入的了解。

謝謝,

布賴恩。

根據MSDN - Calling Native Functions from Managed Code

PInvoke 每次呼叫的成本在 10 到 30 條 x86 指令之間。除了這個固定成本之外,編組還會產生額外的成本。在託管和非託管程式碼中具有相同表示的 blittable 類型之間沒有編組成本。例如,在 int 和 Int32 之間進行轉換是免費的。

根據我的經驗,在 P/Invoking 本機函式時肯定會有成本,但通常不值得擔心性能損失。編組成本是需要牢記的。如果您要傳遞大型結構、字元串等,那麼性能成本將很快顯現出來。

對於頻繁呼叫的 P/Invoked 函式,您可能需要考慮添加[SuppressUnmanagedCodeSecurity]到您的 P/Invoke 函式定義中(請參閱MSDN - SuppressUnmanagedCodeSecurityAttribute)。這會阻止執行時進行堆棧遍歷以確保呼叫者俱有 UnmanagedCode 權限。當然,在添加此屬性之前,請確保您了解安全後果。

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