© best_vector/Shutterstock.com
Kolumne: .NETversum

Ermitteln der Blazor-Architektur und -Versionsnummer


Zur Diagnose und für Fallunterscheidungen hinsichtlich technischer Unterschiede ist es sinnvoll, dass eine Anwendung Informationen darüber liefert, auf welcher technischen Basis sie läuft. Bei Blazor gibt es zwei Architekturen: Blazor WebAssembly und Blazor Server. Sie sind sich sehr ähnlich und erlauben gemeinsamen Programmcode, in dem man aber manchmal dennoch zwischen den beiden Architekturen unterscheiden muss.

Leider kann man die Blazor-Art und die Blazor-Version nicht direkt über die Property einer Klasse abfragen. Daher muss man sich eines Tricks bedienen: Ein Punkt, an dem sich Blazor Server und Blazor WebAssembly zwangsläufig unterscheiden müssen, ist die Implementierung der Schnittstelle IJSRuntime, denn die Interoperabilität mit JavaScript muss aufgrund der unterschiedlichen Architektur in diesen beiden Blazor-Arten verschieden implementiert sein. Man lässt sich also per Dependency Injection eine Instanz der jeweilige Klasse liefern, die IJSRuntime implementiert. Wenn der Name der Klasse WebAssembly enthält, befindet man sich in Blazor WebAssembly. Wenn der Name der Klasse Server enthält, in Blazor Server. Über die Versionsnummer der Assembly, die die IJSRuntime-Klasse realisiert, erhält man auch die Version von Blazor.

Einfach ist hingegen das Ermitteln der Versionsnummer der zugrundeliegenden Laufzeitumgebung (.NET Core für Blazor Server und Mono für Blazor WebAssembly bzw. „.NET“ ab Version 5.0). Sie kann in beiden Fällen über folgende Property abgefragt werden:

System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription

Listing 1 zeigt die Kapselung des oben beschriebenen Tricks in der Klasse BlazorUtil in der Methode GetBlazorVersionInfo(). Außerdem werden die Read-only Properties BlazorType, IsWebAssembly() und IsServer() angeboten.

Listing 1: Ausschnitt aus BlazorUtil.cs

using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Http; using Microsoft.JSInterop; using System; namespace ITVisions.Blazor {  /// <summary>  /// Utility Class for Blazor WebAssembly and Blazor Server  /// </summary> public partial class BlazorUtil { IJSRuntime _jsRuntime { get; set; } // DI public BlazorUtil(IJSRuntime jsRuntime) { _jsRuntime = jsRuntime; } public bool IsWebAssembly => _jsRuntime.GetType().FullName.Contains("WebAssembly"); public bool IsBlazorServer => !IsWebAssembly; public string BlazorType { get => IsWebAssembly ? "WebAssembly" : "Server"; } public string GetBlazorVersionInfo() { string blazorVersion = ""; if (_jsRuntime != null) { blazorVersion = _jsRuntime.GetType().Assembly.GetName().Version.ToString(); }  // Version of Runtime (.NET Core, Mono, .NET >=5) string runtime = System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription; return "Blazor " + BlazorType + (!String.IsNullOrEmpty(blazorVersion...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang