Rolf B: C# Programm läuft nur unter der IDE

Beitrag lesen

Hallo Henry,

ich habe von diesen Aspekten von .net herzlich wenig Ahnung, aber ich kann googlen 😉

Die Json-Klassen können entweder per Reflection herausfinden, welche Properties dein zu serialisierendes Objekt hat, oder es muss Code generiert werden, der über das zu serialisierende Objekt Bescheid weiß.

Reflection funktioniert aber nicht immer. In deinem Fall wegen des self-contained Schalters, wenn ich das richtig verstanden habe. self-contained führt zu einer AOT[1]-Compilation zu nativem Code[2], d.h. dein Output ein linux-x64 Executable und nicht CLR IL[3], die auf dem Zielsystem per JIT[4] in die native Sprache übersetzt wird.

In der IDE funktioniert es, weil dort immer IL entsteht (sonst könntest Du nicht so gut debuggen).

Reflection braucht Daten aus der CLR Assembly und durch die AOT-Compilierung gehen die verloren. JavaScript oder PHP sind da im Vorteil, die wissen immer über ihre Objekte Bescheid. Ob das dotnet-Kommando eine publish-Option kennt, die Reflection ermöglicht, weiß ich nicht. Hier ist die Doku zum Tool.

Wenn Du unbedingt ein self-contained Programm haben willst und es keine Option gibt, die Dir hilft, musst Du ohne Reflection leben. Entweder musst Du Dir einen JSON Serializer generieren lassen oder das Ziel-JSON von Hand bauen.

Ich habe beides noch nie gemacht. Bei learn.microsoft.com findest Du aber Artikel über Reflection vs Sourcegenerierung und auch über händisches Serialisieren per Utf8JsonWriter.

Ich hoffe, es ist etwas für Dich dabei.

Rolf

--
sumpsi - posui - obstruxi

  1. Ahead Of Time, als Gegensatz zu JIT[3:1] ↩︎

  2. Echte Maschinensprache, passend zu verwendetem Mikroprozessor und Betriebssystem ↩︎

  3. Common Language Runtime Intermediate Language, braucht die vollständige .net Runtime, um ausgeführt werden zu können ↩︎ ↩︎

  4. Just In Time Compiler ↩︎