2012-03-27 40 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?