我想知道是否有人对托管.Net代码在Win32方法上使用DLLImport / PInvoke的消极方面有一个不错的解释或概述?
我计划使用各种Win32方法,并希望对这样做的负面影响有更深入的了解。
谢谢,
布赖恩。
答案 0 :(得分:33)
根据MSDN - Calling Native Functions from Managed Code
PInvoke每次调用的开销为10到30 x86。除了这个固定成本之外,编组还会产生额外的开销。在管理和非托管代码中具有相同表示的blittable类型之间没有编组成本。例如,在int和Int32之间进行转换没有任何成本。
根据我的经验,当P /调用本机函数时肯定存在开销,但通常性能损失不值得担心。编组成本是需要记住的。如果你传递大型结构,字符串等,那么性能成本将很快显示出来。
对于频繁调用的P / Invoked函数,您可能需要考虑将[SuppressUnmanagedCodeSecurity]
添加到P / Invoke函数定义中(请参阅MSDN - SuppressUnmanagedCodeSecurityAttribute)。这会阻止运行时执行堆栈遍历以确保调用方具有UnmanagedCode权限。当然,请确保在添加此属性之前了解安全性后果。
答案 1 :(得分:3)
以下是我在PInvoke中看到的一些问题:
如果你计划使用大量非托管函数,我会创建一个混合DLL(http://msdn.microsoft.com/en-us/library/x0w2664k.aspx),而不是声明一堆PInvokes。