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.
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