我有这行代码:
System.Drawing.Icon icon = System.Drawing.Icon.FromHandle(shinfo.hIcon);
几行之后,在使用图标之后,我有了一行:
Win32.DestroyIcon(shinfo.hIcon);
但是,当对我的代码运行静态分析时,它表示资源图标可能存在Resource_Leak。我想知道如果我调用dispose方法会有什么不同:
icon.Dispose();
而不是现在正在使用的Win32.DestroyIcon()。它们之间有什么区别吗?我只是维护这段代码所以我不确定原始开发人员是否有任何使用Win32.DestroyIcon的特殊内容。
答案 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?