【发布时间】:2009-07-08 21:32:54
【问题描述】:
我已经使用 WPF 几年了,除了托管代码之外没有任何经验。我开始编写一个使用大量 win32 互操作的应用程序,我开始怀疑我是在泄漏内存还是在做一些我不知道的愚蠢的事情......所以我想我会寻求一些建议!
在托管代码中使用 win32 调用时是否有任何陷阱/提示/技巧? 我最感兴趣的是内存/垃圾收集,但欢迎任何其他提示!
【问题讨论】:
我已经使用 WPF 几年了,除了托管代码之外没有任何经验。我开始编写一个使用大量 win32 互操作的应用程序,我开始怀疑我是在泄漏内存还是在做一些我不知道的愚蠢的事情......所以我想我会寻求一些建议!
在托管代码中使用 win32 调用时是否有任何陷阱/提示/技巧? 我最感兴趣的是内存/垃圾收集,但欢迎任何其他提示!
【问题讨论】:
没有陷阱。您释放了您分配的所有资源(除非文档表明您进行的调用接管了资源,从而使您摆脱了所有权),这就是它的全部内容。 GC根本不参与。
作为提示,System.Runtime.InteropServices.SafeHandle 是一个使用 Win32 句柄 RAII 样式的常用助手类。
【讨论】:
您在 Win32 中分配的几乎所有资源都必须通过正确的 API 调用进行释放,分配 API 的 MSDN 页面上对此进行了记录。
这是一个完全手动的过程;尽管您可以使用 SafeHandle 或(最后的手段)终结器,但垃圾收集根本无济于事。
至少,在您分配的任何资源周围使用IDisposable 包装类。在某些情况下,这些已经存在于 Windows 窗体中。
您可以使用 Perfmon 或任务管理器来监控进程中打开的句柄数。
【讨论】:
win32 互操作的主要问题是(显然)Linux/Mac OS 不兼容(如果您有对 win32 库的 P/Invokes,Mono 将无法帮助您)。
除此之外,我不知道有任何问题。当然,除非您调用的函数本身会泄漏内存。
【讨论】:
如果您需要调用GetLastError 来确定win32 调用失败的原因,您必须小心一点。 This页面提供了详细的描述。
【讨论】: