2012-03-27 5 views
4

対私は、このコード行を持っています私のコードの静的解析では、アイコンからResource_Leakの可能性があると言います。Win32.DestroyIcon Icon.Dispose

icon.Dispose(); 

ではなく、今使用されているWin32.DestroyIcon():私は、Disposeメソッドを呼び出した場合、それはどんな違いを生むだろう疑問に思って。それらの間に違いはありますか?私はこのコードをそのまま維持しているので、元の開発者がWin32.DestroyIconを使用するための特別なintnetionがあるかどうかはわかりません。

答えて

7

"IDisposableリソース"を廃棄していないため、静的分析が開始されています。

全体を通して管理バージョンに固執し、icon.Dispose()を使用することをおすすめします。これは(内部的に)DestroyIconを呼び出して処理しますが、全体を通して純粋な管理APIに固執します。

Win32.DestroyIconは本当に多くのあなたがいない完全にフレームワークによって管理されているIconインスタンスで使用するために、IntPtrとして受け取っているアイコンで使用するためのものです。

+0

ブリリアントは、ときに私がすることができます答えとしてマークされます、あなたのリードに感謝します。 – DukeOfMarmalade

+0

実際に 'icon.Dispose()'は、(private)boolean 'ownHandle'が真で、それがマネージアイコンオブジェクトがどのように構築されたかによって決まります。具体的には、['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

1

私はこの分野で悲しみの終わりはありませんでした。私はリソースが漏れることなく、フォームのアイコン(したがってタスクバーのアイコン)をアニメートしようとしています。

リソースがリークしたときに、「DestroyIcon」を使用すると、後続のすべての更新に失敗しました。以下のコードはすべて正しい順序で示しています。

APIの宣言:

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

FINALLYソリューション:また、この問題に投稿された

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?