So you have your Visual Basic 2008 Express project. When you created it, you assigned some placeholder icon to serve as the project's icon. The icon shows up alongside the compiled executable in Windows Explorer, and everything's fine.

A few weeks later, you have created a shiny new icon, ready to go! It has multiple resolutions, pretty curves and pleasing colours. It's gorgeous. You go back into Project Settings, add the new icon to the project resources and set it as the project's icon. You re-build.

Nothing changes. Wha?!

This comes down to the way Visual Studio stores its project information. Many project options depend on the build configuration in use, which may be Debug or Release. The GUI allows you to set different values for various options depending on build configuration, then simply switch the configuration before doing a build. This is a useful way to retain your favourite compiler/optimizer switches and flags, without having to re-apply them every time you want to do a real release then go back to developing your next version.

But not all properties fall under the umbrella of build configurations; in particular the entire "Application" tab applies globally to your project, regardless of the build configuration in use. The project icon option is found on this tab.

Unfortunately, when saving these project options to the .vbproj file on disk, Visual Studio first writes your preferences, then writes then again once for each extant build configuration. And when you change these preferences, the changes do not propagate to the build configuration-specific sections of the .vbproj file. Remember, you cannot alter these from the GUI, so your application icon is essentially "stuck".

My solution was to close Visual Studio and manually remove the contents of the <ApplicationIcon> tag wherever I could find it; I then went back into Visual Studio and configured the application icon to be what I wanted.

I found IconViewer to be a good way to verify the icon resources stored within a Windows executable.