Ricavare l’icona associata ad un file

Con il .NET Framework 1.0 e 1.1 un modo era ricorrere all’api SHGetFileInfo come descritto nel seguente:
http://support.microsoft.com/kb/319340/en-us

Con l’introduzione del metodo ExtractAssociatedIcon del .Net framework 2.0 è possibile ottenere lo stesso risultato tramite l’utilizzo del registry evitando così l’utilizzo di PInvoke:

    Public Shared Function GetFileExtensionIcon(ByVal fileExtension As String) As System.Drawing.Icon
        Dim defaultIconFile As String = Nothing

        Dim keyExtension As Microsoft.Win32.RegistryKey

        keyExtension = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(“.” & fileExtension)

        If keyExtension IsNot Nothing Then
            ‘Lettura program name
            Dim programName As String
            programName = keyExtension.GetValue(String.Empty).ToString

            ‘Lettura program default icon
            Dim keyProgramDefaultIcon As Microsoft.Win32.RegistryKey
            keyProgramDefaultIcon = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey( _
                programName & “\DefaultIcon”)

            If keyProgramDefaultIcon IsNot Nothing Then
                Dim defaultIconValue As String
                defaultIconValue = keyProgramDefaultIcon.GetValue(String.Empty).ToString
                defaultIconFile = defaultIconValue.Split(“,”c)(0)
            End If
        End If

        ‘Impostazione a icona di default nel caso non sia stata trovata
        If String.IsNullOrEmpty(defaultIconFile) Then
            defaultIconFile = System.IO.Path.Combine(System.Environment.SystemDirectory, “shell32.dll”)
        End If

        Return System.Drawing.Icon.ExtractAssociatedIcon(defaultIconFile)
    End Function