C# Programm läuft nur unter der IDE
der henry
- c#
- programmiertechnik
Hallo,
ich nutze unter Linux die IDE Rider. Hier läuft mein Programm ohne Probleme.
Um ein einzelnes "ausführbares" File zu bekommen, wird das Programm für Linux, siehe nachfolgend, "compiliert"
dotnet publish -c Release -r linux-x64 --self-contained -p:PublishSingleFile=true -p:PublishTrimmed=true
Wenn ich nun auf dem gleichen Rechner in der auch die IDE läuft, das Programm starte kommt nachfolgende Fehlermeldung.
Unhandled exception. System.InvalidOperationException: Reflection-based serialization has been disabled for this application. Either use the source generator APIs or explicitly configure the 'JsonSerializerOptions.TypeInfoResolver' property. at System.Text.Json.ThrowHelper.ThrowInvalidOperationException_JsonSerializerIsReflectionDisabled() at System.Text.Json.JsonSerializerOptions.ConfigureForJsonSerializer() at System.Text.Json.JsonSerializerOptions.MakeReadOnly(Boolean populateMissingResolver) at System.Text.Json.JsonSerializer.GetTypeInfo(JsonSerializerOptions options, Type inputType) at System.Text.Json.JsonSerializer.GetTypeInfo[T](JsonSerializerOptions options) at System.Text.Json.JsonSerializer.Serialize[TValue](TValue value, JsonSerializerOptions options) at CommPLC.CommPLCProgram.readCpuCpInfo() at CommPLC.CommPLCProgram.openPLC_Device(String ip, Int32 rack, Int32 slot) at Program.Main(String[] args)
json nutze ich nur an einer Stelle "Funktion: readCpuCpInfo" ... ist klar.
Die lib habe ich über using System.Text.Json; eingebunden.
Wenn ich den Aufruf jsonString = JsonSerializer.Serialize(CpuInfoDic, options); herausnehme, funktioniert das Programm auch auf anderen Rechnern.
Ich verstehe nicht, warum diese lib nicht mit integriert wird, bzw. was im Detail die Fehlermeldung genau aussagt ? Alles andere mysql, System.Net.NetworkInformation, System.Security.Cryptography, System.Text usw. usw. nimmt er auch mit ins File und es läuft ??
Vielen Dank !!!
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
Hallo Rolf,
Vielen Dank für deine ausführliche Erklärung … wieder was dazu gelernt 👍
Es handelt sich nur um ein/zwei Variablen, das werde ich selbst „mit Hand“ in json wandeln, kein Problem.
Gruß
Hallo der henry,
👍
Vorhin in der Zeitung gelesen: 👍 ist für die heutige Jugend (GenZ) ein Grund, die Kommunikation abzubrechen („Wer mir ein 👍-Emoji schickt, den blockiere ich!“). Angeblich sei 👍 passiv-aggressiv oder ironisch und damit unfreundlich. Bei mir als Boomer/GenX-er kommt das eher nicht so an.
Ja gut, wenn jemand offenkundig Mist baut – mir z.B. die Vorfahrt nimmt –, kann ich mit 👍 oder 👌 reagieren, um ironisch meinen Ärger auszudrücken (wobei 👌 auch eine gewisse Körperöffnung darstellen kann). Aber im Kontext ist dann absolut klar, dass 🖕 gemeint ist.
Schreibt meine Zeitung Müll oder ist diese Einstellung verbreitet?
Rolf
... um Gottes willen 🤪😂 ...
wie schon mal erwähnt, bin ich etwas älter ...
Ein 👍 bedeutet in meinem Umfeld, super oder aber Danke,
ein 👌 .... perfekt oder sehr gut gemacht
Ich käme hier gar nicht auf eine andere Idee ...
Bitte nicht versuchen zwischen den Zeilen zu lesen, wenn da gar nichts steht.
Gruß
Moin Rolf,
entschuldigt das Off-Topic.
Ja gut, wenn jemand offenkundig Mist baut – mir z.B. die Vorfahrt nimmt –, kann ich mit 👍 oder 👌 reagieren, um ironisch meinen Ärger auszudrücken (wobei 👌 auch eine gewisse Körperöffnung darstellen kann). Aber im Kontext ist dann absolut klar, dass 🖕 gemeint ist.
Letztere Geste ist schon von anderen gekapert worden.
Wie die Rechten eben gerne Sprache vereinnahmen.
Gruß,
Hallo,
👍 oder 👌 auch 🖕
Letztere Geste
du hasst da einen off by one bug…
Gruß
Kalk
Moin Tabellenkalk,
👍 oder 👌 auch 🖕
Letztere Geste
du hasst da einen off by one bug…
Ordne ich unter Logikfehler ein.
Gruß,