I realize this is old, but I figured I'd point out that the real reason you are getting this error is because InPtrs are unmanaged, which means you need to dispose of them yourself as .NET will not do this for you.
This line:
TrayIconCPU.Icon = Icon.FromHandle(m_TrayBitmap.GetHicon)
needs to be changed to:
IntPtr Hicon = img.GetHicon();
Icon newIcon = Icon.FromHandle(Hicon);
TrayIconCPU.Icon = newIcon;
DestroyIcon(newIcon.Handle);
In order to call the DestroyIcon method you'll need this in your class:
[System.Runtime.InteropServices.DllImport("user32.dll", CharSet = CharSet.Auto)]
extern static bool DestroyIcon(IntPtr handle);
And you'll need to add using for System.Runtime.InteropServices:
using System.Runtime.InteropServices;
Just wanted to help out others that may come across this in the future.