在Win32/COM方法上调用PInvoke时,通常会有明显的性能损失吗?

Bri*_*ott 26 .net performance pinvoke marshalling dllimport

我想知道是否有人对管理.Net代码在Win32方法上使用DLLImport/PInvoke的负面影响有一个不错的解释或概述?

我计划使用各种Win32方法,并希望对这样做的负面影响有更深入的了解.

谢谢,

布莱恩.

Lee*_*ger 35

根据MSDN - 从托管代码调用本机函数

PInvoke每次调用的开销在10到30 x86之间.除了这个固定成本之外,编组还会产生额外的开销.在管理和非托管代码中具有相同表示的blittable类型之间没有编组成本.例如,在int和Int32之间进行转换没有成本.

根据我的经验,在P/Invoking本机函数时肯定存在开销,但通常性能损失不值得担心.编组成本是需要记住的.如果您传递大型结构,字符串等,那么性能成本将很快显示出来.

对于非常频繁调用的P/Invoked函数,您可能需要考虑添加[SuppressUnmanagedCodeSecurity]到P/Invoke函数定义(请参阅MSDN - SuppressUnmanagedCodeSecurityAttribute).这会阻止运行时执行堆栈遍历以确保调用方具有UnmanagedCode权限.当然,在添加此属性之前,请确保您了解安全性后果.

  • 谢谢你的参考.这是一个有用的阅读. (2认同)
  • .NET Core 删除了 CLR 中的“部分信任”功能,因此不再需要“[SuppressUnmanagedCodeSecurity]”(事实上它已从 .NET Core 中完全删除):https://github.com/dotnet/runtime/issues /4514 (2认同)