Visual Basic, .NET 6 18.01.2022, 15:00 Uhr

Erstes Icon holen

In einer ausführbaren Windows-Datei (*.exe) stecken in der Regel ein oder mehrere Icons. Will man seiner Anwendung einen Programmstarter mit Icon-Anzeige spendieren, muss man diese auslesen.
(Quelle: Bernhard Lauer)
Das Auslesen eines Icons aus einer Exe-Datei klappt unter Windows mit den .NET-Klassen aus dem Namensraum System.Drawing. Stellt man ein Programm von .NET 4.x auf .NET 6.0 um, stellt man fest, dass der Namensraum System.Drawing nur teilweise für .NET 6 nachgebildet worden ist. Der Grund: Einige Methoden des Namensraums wurden (noch?) nicht für andere Betriebssysteme aufbereitet und fehlen deshalb in .NET 6.0.
Für den Fall, dass das umzustellende Programm nur auf Windows laufen soll, oder eine separate Windows-Version geplant ist, helfen Microsofts .NET Platform Extensions 6, welche die nur für Windows verwendbaren Methoden sammelt und separat bereitstellt. Um sie nachzuladen muss das NuGet-Paket Microsoft.Windows.Compatibility installiert werden, das entweder hier oder über die NuGet-Paketverwaltung von Visual Studio geladen werden kann.
Sind die Erweiterungen installiert klappt auch das Auslesen des ersten Icons einer Exe-Datei mit .NET 6. Dafür wird zunächst der Namensraum System.Drawing eingebunden:
Imports System.Drawing 
Danach kann der Code der Funktion kodiert werden. Wichtig dabei: Eine Klasse namens Image ist sowohl im Namensraum System.Drawing als auch im Namensraum System.Windows.Controls zu finden. Für die vorliegende Aufgabe muss die Klasse System.Windows.Controls.Image genutzt werden. Im Sinne größtmöglicher Klarheit wurden die Namensräume im Code komplett ausformuliert:
Function erstesIconHolen(
  ByVal p As String) As System.Windows.Controls.Image

  Dim img As New System.Windows.Controls.Image
  Try
    Dim ico As Icon = System.Drawing.Icon.ExtractAssociatedIcon(p)
    Dim strm As New MemoryStream
    Dim bmp = ico.ToBitmap
    bmp.Save(strm, System.Drawing.Imaging.ImageFormat.Png)
    strm.Seek(0, SeekOrigin.Begin)
    Dim pbd As New PngBitmapDecoder(strm,
      BitmapCreateOptions.None, BitmapCacheOption.Default)
    img.Source = pbd.Frames(0)
  Catch ex As Exception
    MsgBox(p & vbCrLf & "Icon holen ist fehlgeschlagen!" &
      vbCrLf & ex.ToString)
  End Try
  Return img
End Function


Das könnte Sie auch interessieren