Win32.DestroyIcon与Icon.Dispose
我有这行代码:
System.Drawing.Icon icon = System.Drawing.Icon.FromHandle(shinfo.hIcon);
几行之后,在使用图标之后,我有一行:
Win32.DestroyIcon(shinfo.hIcon);
但是,当对我的代码运行静态分析时,它表示Resource_Leak可能来自图标。 我想知道如果我调用dispose方法会有什么不同:
icon.Dispose();
而不是现在正在使用的Win32.DestroyIcon()。 它们之间有什么区别吗? 我只是维护这段代码所以我不确定原始开发人员是否有任何使用Win32.DestroyIcon的特殊内容。
静态分析正在触发,因为您没有处置“IDisposable资源”。
我建议坚持使用托管版本,并使用icon.Dispose()
。 这将(内部)负责为您调用DestroyIcon
,但始终坚持使用纯托管API。
Win32.DestroyIcon
实际上更适用于您作为IntPtr
接收的图标,而不是用于完全由框架管理的Icon
实例。
我在这个领域没有悲伤 – 我一直试图在不泄漏资源的情况下为表单的图标(以及任务栏中的图标)设置动画。
当我处理图标(如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:我应该处理它,还是调用DestroyIcon?