Win32.DestroyIcon против Icon.Dispose - PullRequest
5 голосов
/ 27 марта 2012

У меня есть эта строка кода:

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

Через несколько строк после использования значка у меня появляется строка:

Win32.DestroyIcon(shinfo.hIcon);

Однако при выполнении статического анализа на моемкод говорит, что есть потенциал для Resource_Leak от значка.Мне интересно, будет ли иметь какое-либо значение, если я вызову метод dispose:

icon.Dispose();

, а не Win32.DestroyIcon (), который используется сейчас.Есть ли разница между ними?Я просто поддерживаю этот код, так что я не уверен, было ли у разработчика оригинальное намерение использовать Win32.DestroyIcon.

Ответы [ 2 ]

9 голосов
/ 27 марта 2012

Статический анализ запускается, потому что вы не утилизируете «IDisposable resource».

Я бы порекомендовал придерживаться управляемой версии и использовать icon.Dispose(). Это (внутренне) позаботится о том, чтобы вам звонили DestroyIcon, но везде придерживайтесь чистого управляемого API.

Win32.DestroyIcon действительно предназначен больше для использования с иконками, которые вы получаете как IntPtr, а не для использования с экземпляром Icon, который полностью управляется платформой.

1 голос
/ 19 ноября 2015

У меня НЕТ КОНЦА скорби в этой области - я пытался анимировать значок формы (и, следовательно, значок в панели задач) без утечки ресурсов.

Когда я избавился от значка (как это было предложено в 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: я должен избавиться от него или вызвать DestroyIcon?

...