2012-03-27 15 views
4

Ich habe diese Zeile Code:Win32.DestroyIcon vs. Icon.Dispose

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

Einige Zeilen später, nachdem Symbol verwendet wird, habe ich die Zeile:

Win32.DestroyIcon(shinfo.hIcon); 

jedoch, wenn ein Lauf statische Analyse auf meinem Code sagt es gibt ein Potenzial für Resource_Leak von Symbol. Ich frage mich, wird es keinen Unterschied machen, wenn ich die dispose-Methode aufrufen:

icon.Dispose(); 

statt die Win32.DestroyIcon(), die jetzt verwendet wird. Gibt es einen Unterschied zwischen ihnen? Ich behalte nur diesen Code, also bin ich nicht sicher, ob es eine spezielle Intention vom ursprünglichen Entwickler gab, um Win32.DestroyIcon zu benutzen.

Antwort

7

Die statische Analyse löst aus, weil Sie die "IDisposable Ressource" nicht entsorgen.

Ich würde empfehlen, durchgängig an der verwalteten Version zu bleiben und icon.Dispose() zu verwenden. Dies wird sich (intern) darum kümmern, DestroyIcon für Sie aufzurufen, aber halten Sie sich dabei an die reine verwaltete API.

Win32.DestroyIcon ist wirklich mehr für die Verwendung mit Symbolen, die Sie als IntPtr sind empfangen, nicht für die Verwendung mit einer Icon Instanz, die vollständig durch den Rahmen geführt wird.

+0

Brilliant, danke Reed, wird als Antwort markieren, wenn ich kann. – DukeOfMarmalade

+0

Tatsächlich zerstört 'icon.Dispose()' nur das Icon, wenn der (private) boolean 'ownHandle' wahr ist, und das hängt davon ab, wie das verwaltete Icon-Objekt konstruiert wurde. Insbesondere setzt ['Icon.FromHandle (..)' diesen booleschen Wert auf false] (https://referencesource.microsoft.com/#System.Drawing/commonui/System/Drawing/Icon.cs.3a4e2c70109d46bc) und so [' Icon.Dispose() 'tut gar nichts] (https://referencesource.microsoft.com/#System.Drawing/commonui/System/Drawing/Icon.cs8d050d7603efcc48). – JBSnorro

1

Ich hatte KEINEN ENDE der Trauer in diesem Bereich - Ich habe versucht, das Symbol eines Formulars (und folglich das in der Taskleiste) zu animieren, ohne dass Ressourcen verloren gehen.

Wenn ich das Symbol entsorgte (wie in MSDN vorgeschlagen) Ressourcen durchgesickert, als ich "DestroyIcon" verwendet alle nachfolgenden Updates fehlgeschlagen. Dieser Code zeigt alles in der richtigen Reihenfolge.

API Deklaration:

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

endlich die Lösung:

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

Auch in dieser Frage gestellt: Icon.FromHandle: should I Dispose it, or call DestroyIcon?