Win32.DestroyIcon与Icon.Dispose

时间:2012-03-27 15:38:24

标签: c# garbage-collection dispose

我有这行代码:

System.Drawing.Icon icon = System.Drawing.Icon.FromHandle(shinfo.hIcon);

几行之后,在使用图标之后,我有了一行:

Win32.DestroyIcon(shinfo.hIcon);

但是,当对我的代码运行静态分析时,它表示资源图标可能存在Resource_Leak。我想知道如果我调用dispose方法会有什么不同:

icon.Dispose();

而不是现在正在使用的Win32.DestroyIcon()。它们之间有什么区别吗?我只是维护这段代码所以我不确定原始开发人员是否有任何使用Win32.DestroyIcon的特殊内容。

2 个答案:

答案 0 :(得分:8)

静态分析正在触发,因为您没有处置“IDisposable资源”。

我建议您始终坚持托管版本并使用icon.Dispose()。这将(内部)负责为您调用DestroyIcon,但始终坚持使用纯托管API。

Win32.DestroyIcon实际上更适用于您作为IntPtr收到的图标,而非用于完全由框架管理的Icon实例。

答案 1 :(得分:1)

我在这方面没有悲伤 - 我一直试图在不泄漏资源的情况下为表单的图标(以及任务栏中的图标)设置动画。

当我处理图标(如MSDN上建议的)资源泄露时,当我使用“DestroyIcon”时,所有后续更新都失败了。下面的代码以正确的顺序显示所有内容。

API声明:

[System.Runtime.InteropServices.DllImport("user32.dll", CharSet = CharSet.Auto)]
extern static bool DestroyIcon(IntPtr handle);

最终解决方案:

IntPtr iconHandle = dynamicBitmap.GetHicon();
Icon tempManagedRes = Icon.FromHandle(iconHandle);
this.Icon = (Icon)tempManagedRes.Clone();
tempManagedRes.Dispose();
DestroyIcon(iconHandle);

也发表在这个问题: Icon.FromHandle: should I Dispose it, or call DestroyIcon?