Windows Link mit Android

Bei der Einrichtung meines neuen Telefons habe ich eine praktische Funktion entdeckt:

Man kann direkt Anwendungen (neudeutsch: Apps) direkt auf dem PC starten und anzeigen… es werden dann ‚richtige‘ Fenster auf dem Desktop angezeigt.

Dies funktioniert mit der ‚Ihr Smartphone‘ unter Windows 10.

Sehr amüsant… jetzt brauch ich nur noch eine App, die nur auf dem Handy funktioniert und nicht auf dem PC…

.Net Core – Doppelt geladene Assemblies

Wurde mal wieder mit folgender Fehlermeldung begrüßt:

System.InvalidCastException :
[A]DatenMeister.Modules.ZipCodeExample.ZipCodeModel cannot be cast to
[B]DatenMeister.Modules.ZipCodeExample.ZipCodeModel.
Type A originates from
'DatenMeister.Modules.ZipCodeExample, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' in the context 'Default' at location 'C:\Projekte\DatenMeister\src\Tests\DatenMeister.Tests\bin\Debug\net5.0\DatenMeister.Modules.ZipCodeExample.dll'.
Type B originates from
'DatenMeister.Modules.ZipCodeExample, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' in the context 'Default' at location 'C:\Projekte\DatenMeister\src\Tests\DatenMeister.Tests\bin\Debug\net5.0\DatenMeister.Modules.ZipCodeExample.dll'.

Was ist passiert?
Über ein dynamische Assembly.LoadFrom habe ich über ein Plugin-System die Assembly ZipCodeExample eingeladen. Weiterhin habe ich im Quelltext über eine ProjectReference parallel die Typen in der Assembly genutzt.

.Net Core hat hier ein geändertes Verhalten im Gegensatz zum .Net Framework und erzeugt zwei Instanzen der Assembly. Das heißt, dass die Instanziierungen der Typen in dieser Assembly, je nach Aufrufer unterschiedlich sind, obwohl sie scheinbar vom gleichen Typ sind… Den Unterschied erkennt man über die Eigenschaft m_assembly in dem dahinterliegenden Typ.

Nochmal:
Programm lädt Plugins ein und Plugin-Start-Methode auf
Plugins instanziiert ein Hilfsobject ZipCodeModel und speichert es in einer ObjektDatenbank

Programm ruft eigentliche Routine auf, die das ZipCodeModel per ProjectReference nutzt
Die Objekt-Datenbank gab das per Plugin erzeugte Objekt zurück (da gleicher FullName).
Allerdings passen die Typen nicht zueinander, da das per Plugin erzeugte Objekt vom anderen Typ als die Project Reference ist.

Unschön… hier hatte ich auch mal vor einiger Zeit ein Issue erzeugt über das ich eine sehr schöne Erklärung erhalten hatte: Assembly Loading via ProjectReference and Assembly.LoadFile upon same file leads to two instances · Issue #36787 · dotnet/runtime (github.com)

Die Lösung:
Über folgenden Artikel habe ich die Information erhalten, dass Load statt LoadFrom das doppelte Einladen vermeidet. ==> Plugin Loader is now working correctly by using Load instead of Load … · mbrenn/datenmeister-new@3c87d92 (github.com)

Das Ergebnis:

Success, wo man auch immer hinschaut.

0 Tage Scholz,

Nach 16 Jahren Merkel, habe ich nun vier Bundeskanzler:innen erlebt:

  • Schmidt (Ok, im Alter bis 2 Jahre)
  • Kohl (mit der Erinnerung an den Mauerfall in der Kindheit)
  • Schröder (Elefantenrunde)
  • Merkel (naja… mal schauen, was die Erinnerung in einigen Jahren bringt)

Nun führt Bundeskanzler Scholz unser Land und ich persönlich dem Herren und seinen Minister:innen auch zu meinem Vorteil viel Erfolg! Warten wir auf die ersten 100 Tage ab, zu der ich jeder neuen Rollen bedingungslos erstmal nur das Positive sehe. Und aktuell sind die Herausforderungen groß… sehr groß!

In diesem Sinne… Peace out!

Apropos… Thema das Tages: Omikron… ich bleibe gespannt, nach diversen Berechnungen werden wir hier in Deutschland um Januar bis Februar den Omikron-Höhepunkt erreicht haben und die Welle wird dazu führen, dass jeder von uns dem Virus ausgesetzt werden wird. Daher: Bitte lasst euch bedingungslos impfen. Falls jemand sich nicht impfen möchte, würde mich die Motivation dieser Person (vorurteilsfrei) interessieren, schreibt mir… brenn@depon.net (as you know). Falls jemand in die Erstimpfung (erwiesenermaßen) geht, sponsore ich auch eine Tafel Ritter Sport nach Wahl! *

*) Natürlich nur an nette Menschen, die ich persönlich auch kennen könnte.

Nintendo Switch: N64 Emulutor

Nachdem für die Switch ein N64 Emulator von Nintendo themselves vor zwei Monaten angekündigt war, habe ich mir das Abo geholt (Yet another Abo) und erstmal die alten Marios auf NES und SNES durchgespielt! Eine große Freude und insbesondere mit Hilfe des ‚Rewind‘-Features bei dem man sehr schnell in die Vergangenheit zurückgehen kann und den tödlichen Sprung nochmals wiederholen! Yeah!

Im November kam nun der Emulator heraus und ich muss leider sagen: Scheiß.

Nicht nur, dass das Abo 19,99 EUR / Jahr kostet,… nein, für den N64 Emulator muss man noch ein extended Abo holen, was weitere 20 EUR / Jahr kostet. Im Prinzip eine Unverschämtheit für weitere emulierte Spiele… Insgesamt passt Preis/Leistung nicht zu anderen Games-Abos…

Dann ist der N64 Emulator auch noch technisch mangelhaft, wie so einige Rezensionen zeigen.
Nintendo Switch: „Unspielbar!“ – N64-Update verärgert Käufer (pcgames.de)

Dies führt leider dazu, dass ich weiterhin einen der guten PC-Emulatoren nutzen könnte, die mir Mario und Zelda auf 4K anbieten… Die Original Cartridge liegt daneben. Ich persönlich finde es sehr schade, dass Nintendo kein technisch hochwertiges Produkt liefern konnte. Die Spiele selbst sind spielerisch höchwertig.

Ein Bild-Vergleich zwischen N64, Wii-Emulator und N64 auf der Switch:

Nichtsdestotrotz: Mein Plan war es während der Pandemie alle Zelda Spiele durchzuspielen… Da es nun leider eine Verlängerung der Pandemie gibt, habe ich noch etwas Zeit… Wobei ich erst bei Ocarina of Time bin…

Visual Studio 2022

Visual Studio 2022

Installiert und läuft… leider ist das Resharper-Plugin von JetBrains noch nicht kompatibel zu VS2022… Die Preview-Version habe ich nicht ausprobiert.

Nichtsdestotrotz sind mir bisher keine Mängel aufgefallen.

ASP.Net Core

Zum kommenden Oster-Urlaub hatte ich beschlossen mich mit den neuesten .Net Core Technologien zumindest teilweise zu beschäftigen. Hier bin ich leider schon seit 10 Jahren völlig aus dem Geschäft… im Geiste grob bei PHP 4…

Daher habe ich nun eine Demo-Website mit 4 verschiedenen Technologien aufgebaut um mich ein wenig selbst zu trainieren: http://zipcode.depon.net/

Screenshot: http://zipcode.depon.net/

Im Prinzip eine sehr einfache Website, welche eine Datenbank über alle Postleitzahlen beinhaltet und dem Nutzer zur Verfügung stellt:

  • WebAPI über ASP.Net Core Controller:
    • Hier wird eine statische Seite eingeladen, die ein JavaScript (kompiliert aus TypeScript) beinhaltet. Diese lädt die Daten über die Web-API vom Server. (ASP.Net Core Web Controller)
  • Statische Seite über Razor Pages:
    • Dies ist ein klassisches Formular, welches über einen POST-Request eine neue Seite aufbaut. Server-Seitig wird dann über Razor-Pages eine komplett neue Seite geschickt
  • Server-Side Blazor-Pages:
    • Schon etwas freakiger… Im Prinzip eine statische Seite, bei der die Java Script-Events über eine persistente SignalR (WebSockets)-Verbindung zum Server geschickt wird. Der Server aktualisiert daraufhin Teile der Website (Components) und das fertig gerenderte DOM wird dann wieder über die SignalR-Schnittstelle zum Browser geschickt.
  • Client-Side Blazor Pages:
    • Massiv freakig… Hier wird die Razor-Page auf dem Browser in einer WebAssembly gerendert. Der dahinterliegende Code ist in C# geschrieben und in diesem Falle exakt der gleiche Code wie auf der Server-Side. Das WebAssembly enthält auch große Teile des .Net Codes, so dass nahezu alle Funktionen zur Verfügung stehen.
    • Die Daten werden bei Änderung über die WebAPI, wie im ersten Beispiel eingeladen. Die Tabelle wird aber dann nicht per JavaScript (via TypeScript) aufgebaut, sondern in der WebAssembly.
    • Hierbei braucht man überhaupt kein JavaScript mehr schreiben…
    • Allerdings gibt es einen Offset von ~15 MB um die kompilierten .Net Assemblies einzuladen. Hier ist aber noch viel Verbesserung für die Zukunft versprochen.

Der Sourcecode findet sich unter:

datenmeister-new/src/Web at · mbrenn/datenmeister-new · GitHub