【问题标题】:Using win32 in managed code在托管代码中使用 win32
【发布时间】:2009-07-08 21:32:54
【问题描述】:

我已经使用 WPF 几年了,除了托管代码之外没有任何经验。我开始编写一个使用大量 win32 互操作的应用程序,我开始怀疑我是在泄漏内存还是在做一些我不知道的愚蠢的事情......所以我想我会寻求一些建议!

在托管代码中使用 win32 调用时是否有任何陷阱/提示/技巧? 我最感兴趣的是内存/垃圾收集,但欢迎任何其他提示!

【问题讨论】:

    标签: c# wpf winapi


    【解决方案1】:

    没有陷阱。您释放了您分配的所有资源(除非文档表明您进行的调用接管了资源,从而使您摆脱了所有权),这就是它的全部内容。 GC根本不参与。

    作为提示,System.Runtime.InteropServices.SafeHandle 是一个使用 Win32 句柄 RAII 样式的常用助手类。

    【讨论】:

      【解决方案2】:

      您在 Win32 中分配的几乎所有资源都必须通过正确的 API 调用进行释放,分配 API 的 MSDN 页面上对此进行了记录。

      这是一个完全手动的过程;尽管您可以使用 SafeHandle 或(最后的手段)终结器,但垃圾收集根本无济于事。

      至少,在您分配的任何资源周围使用IDisposable 包装类。在某些情况下,这些已经存在于 Windows 窗体中。

      您可以使用 Perfmon 或任务管理器来监控进程中打开的句柄数。

      【讨论】:

        【解决方案3】:

        win32 互操作的主要问题是(显然)Linux/Mac OS 不兼容(如果您有对 win32 库的 P/Invokes,Mono 将无法帮助您)。

        除此之外,我不知道有任何问题。当然,除非您调用的函数本身会泄漏内存。

        【讨论】:

          【解决方案4】:

          如果您需要调用GetLastError 来确定win32 调用失败的原因,您必须小心一点。 This页面提供了详细的描述。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-01-29
            • 2010-12-10
            • 2013-08-24
            • 1970-01-01
            • 1970-01-01
            • 2012-09-23
            • 2010-09-18
            • 1970-01-01
            相关资源
            最近更新 更多