Win32.DestroyIcon vs. Icon.Dispose

Ho questa linea di codice:

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

Alcune righe dopo, dopo l’uso dell’icona, ho la linea:

 Win32.DestroyIcon(shinfo.hIcon); 

Tuttavia, quando eseguo un’analisi statica sul mio codice, si dice che c’è un potenziale per Resource_Leak dall’icona. Mi chiedo se farà qualche differenza se chiamo il metodo di smaltimento:

 icon.Dispose(); 

piuttosto che il Win32.DestroyIcon () che viene utilizzato in questo momento. C’è qualche differenza tra loro? Sto solo mantenendo questo codice quindi non sono sicuro se ci fosse qualche intnetion speciale da parte dello sviluppatore originale per usare Win32.DestroyIcon.

L’analisi statica si triggers perché non si sta eliminando la “risorsa IDisposable”.

Raccomanderei di attenersi alla versione gestita in tutto e utilizzare icon.Dispose() . Questo (internamente) si prenderà cura di chiamare DestroyIcon per te, ma si DestroyIcon all’API pura gestita.

Win32.DestroyIcon è realmente destinato all’uso con le icone che si ricevono come IntPtr , non per l’uso con un’istanza Icon gestita interamente dal framework.

Non ho avuto FINE di dolore in quest’area – Ho cercato di animare l’icona di un form (e di conseguenza quella nella barra delle applicazioni) senza che trapelasse risorse.

Quando ho eliminato l’icona (come suggerito su MSDN), le risorse trapelate, quando ho usato “DestroyIcon” tutti gli aggiornamenti successivi non sono riusciti. Questo codice qui sotto mostra tutto nell’ordine corretto.

Dichiarazione API:

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

FINALMENTE la soluzione:

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

Pubblicato anche in questa domanda: Icon.FromHandle: dovrei Smaltirlo o chiamare DestroyIcon?