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