在托管代码中使用win32

时间:2009-07-08 21:32:54

标签: c# wpf winapi

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

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

4 个答案:

答案 0 :(得分:4)

没有陷阱。您释放了所分配的所有资源(除非文档表明您所做的调用接管了资源,从而使您免于拥有),而且这就是它的全部内容。 GC根本不会进入。

作为提示,System.Runtime.InteropServices.SafeHandle是一个股票助手类,使用Win32处理RAII风格。

答案 1 :(得分:3)

您在Win32中分配的几乎所有资源都必须使用正确的API调用取消分配,该调用记录在分配API的MSDN页面上。

这是一个完全手动的过程;垃圾收集根本没有帮助,尽管你可以使用SafeHandle或(最后的手段)终结器。

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

如果您需要致电GetLastError以确定win32呼叫失败的原因,您必须要小心。 This页面提供了详细说明。