Skip to main content

Adding a Missing Icon to Program and Features for a Click Once install, VB.NET

 Click once is a great way to install win form applications within your organization. One issue I discovered recently is that the installed application’s icon does not appear in the Add/Remove programs (or Program and Features) dialog screen. This does not look very professional.

Searching the internet I found a work around here (this has both C# and VB.Net examples):

I made a few changes to the VB.Net code which I share below. A few issues I found that you should keep in mind:

  • Icon file should be set to Copy Always for the property Copy to Output Directory
  • Make sure your display name and product name match exactly as these are compared.
  • Icon is only updated on the first run of the application after install, so if you’re testing this code you will need to un-install before the next test/install.

Here’s my code, you will need to replace the calendar.ico text with your icon file and add the imports.

Imports System.Deployment.Application
   Imports Microsoft.Win32

   Sub SetAddRemoveProgramsIcon()
            'only run if deployed 
            If ApplicationDeployment.IsNetworkDeployed And ApplicationDeployment.CurrentDeployment.IsFirstRun Then

                Dim iconSourcePath As String = System.IO.Path.Combine(Application.StartupPath, "calendar.ico")

                If Not File.Exists(iconSourcePath) Then
                End If

                Dim myUninstallKey As RegistryKey = Registry.CurrentUser.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Uninstall")
                Dim mySubKeyNames As String() = myUninstallKey.GetSubKeyNames()

                Dim i As Integer
                For i = 0 To mySubKeyNames.Length

                    Dim myKey As RegistryKey = myUninstallKey.OpenSubKey(mySubKeyNames(i), True)
                    Dim registryAppName As Object = myKey.GetValue("DisplayName")
                    Dim registryAppVersion As Object = myKey.GetValue("DisplayVersion")
                    If registryAppName <> Nothing And registryAppVersion <> Nothing And
                        registryAppName.ToString().StartsWith(Application.ProductName) And
                        registryAppVersion = ApplicationDeployment.CurrentDeployment.CurrentVersion.ToString() Then

                        myKey.SetValue("DisplayIcon", iconSourcePath)
                        Exit For

                    End If

            End If

        Catch ex As Exception
        End Try
    End Sub

Let me know if you have any questions.


Popular posts from this blog

Artist Friend's Art Links

 A few links from artist friends I know: Sue Buehler Kathleen Kent Lora Lee Chapman Heather Szarka Swee Oh David Robinson Gary Paakkonen Katie Wright Lauri Novak And here's one of my pics, just for fun!

What's in a Name

 A friend recently posted on social media the meaning of their name, which I thought was interesting. So I deciphered mine and came up with this: Traveler of heavenly waters, builder of ships .  This is my First, Last, Middle names deciphered thanks to the internet. I find this interesting since I love to be by water or in water. I also like to build things. I guess my name is a good name for me. Cheers, Wade PS. Here's some water, since I also like taking pictures. 😊

Sunshine Reaching

With rays of warmth, he embraces her soul.  Arms, iron strong, surround their love. Sunshine reaching, fills the room.  With feathered whispers, they embrace the day. Poetry and picture by me. Picture taken in 2017 and re-edited today for this post. Cheers, Wade