2012-03-27 22 views
4

我有这行代码: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的任何特殊插入。

回答

7

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

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

Win32.DestroyIcon确实更适合与您正在收到的图标一起使用,作为IntPtr,不适用于完全由框架管理的Icon实例。

+0

辉煌,谢谢里德,当我可以将标记为答案。 – DukeOfMarmalade 2012-03-27 15:42:01

+0

实际上,如果(private)boolean'ownHandle'为true,'icon.Dispose()'只会销毁图标,这取决于托管图标对象的构造方式。具体来说,['Icon.FromHandle(..)'将布尔值设置为false](https://referencesource.microsoft.com/#System.Drawing/commonui/System/Drawing/Icon.cs,3a4e2c70109d46bc)等[ Icon.Dispose()'什么也不做](https://referencesource.microsoft.com/#System.Drawing/commonui/System/Drawing/Icon.cs,8d050d7603efcc48)。 – JBSnorro 2018-01-14 22:15:37

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?