Ist C# voll rückwärtskompatibel?

2 Antworten

Kurze Antwort: Jein ;)

Lange Antwort:

2016 hat Microsoft .NET neu entwickelt, nicht nur die BCL (Base Class Library), sondern auch SDK und Runtime. Beides ist untereinander nicht kompatibel, weshalb vorrübergehend .NET Standard als eine Art Definition entwickelt wurde. Außerdem wurden die Projekt-Dateien deutlich überarbeitet und Frameworks wie Entity Framework und ASP.NET wurden ebenfalls neu entwickelt.
Bevor Du jetzt wütend über Microsoft schimpfst: Dass sie das gemacht haben war sinnvoll und notwendig. Jede Programmiersprache muss hin und wieder überarbeitet werden, Microsoft hat sich das getraut, das tut nicht jede Firma bei so großer Reichweite. Und dank dem Neubau haben wir jetzt massig Vorteile.

Du kannst alte Projekte weiterhin kompilieren, aber die neue Runtime ist damit nicht kompatibel, die musst Du vorher installieren. Ab .NET 5 ist es dann wieder abwärtskompatibel, Du kannst eine für .NET 5 entwickelte Anwendung unter .NET 7 laufen lassen, aber eine für .NET 4.8 entwickelte Anwendung läuft nicht unter .NET 5 oder neues.

Die Projekt-Datei-Formate können nur so halb miteinander gemischt werden. Ein neues SDK-Format kann das alte Format nicht nutzen, umgekehrt geht es schon, man muss aber mehr beachten, weil manche Automatismen nicht funktionieren.

Im Code gab's auch Veränderungen, es kann also sein, dass der Code nicht ohne Anpassungen läuft, den Großteil sollte man aber problemlos übernehmen können.

Am besten fährst Du, wenn Du ein neues .NET 7 (oder bald 8) Projekt erstellst und den Code migrierst. Wie viel Du übernehmen kannst, hängt davon ab, was Du vorher verwendet hast. Z.B. das alte ASP.NET läuft nicht mit dem neuen .NET, da musst Du ASP.NET Core nutzen, was aber einige andere Wege geht und ein aufwändigerer Umbau werden würde. WPF wurde dagegen migriert, man muss hier und da was anders machen, aber im Großen und Ganzen ist es gleich. Die Konsole läuft natürlich weiterhin überall wie gewohnt.

Aber es lohnt sich zu migrieren, die "neue Welt" wird auch in Zukunft fortgesetzt und es gibt eine ganze Menge Neuerungen/Verbesserungen, die es wert sind.

PS:

Unterscheiden kann man alte und neue Welt am Namen:

.NET Framework => Alte Welt
.NET => Neue Welt

Woher ich das weiß:Berufserfahrung – C#.NET Senior Softwareentwickler

lucca278 
Beitragsersteller
 21.07.2023, 07:58

Danke für die ausführliche Antwort!

1

Du kannst eine alte Bibliothek in ein neues Projekt einbinden. Demnach ist es abwärtskompatibel. Der alte Code würde in dem Fall über die neue Version von .NET ausgeführt werden. Beim direkten Kompilieren von altem Code sollte es aber Fehler werfen. In dem Fall wäre es hilfreich, den alten Code auf deine .NET Version umzustellen, die du installiert hast


lucca278 
Beitragsersteller
 20.07.2023, 13:57

Danke, ist die Umstellung aufwändig oder eher ein paar Kleinigkeiten die man schnell erledigt? (Ich weiß schon, kommt drauf an, aber so als grobe Vorstellung wie es normalerweise ist.)

0
FaTech  20.07.2023, 13:58
@lucca278

In der Regel diese eine Zeile in der csproj Datei anpassen:
<TargetFramework>net7.0</TargetFramework>

0
FaTech  20.07.2023, 14:02
@lucca278

Achso und wenn das Projekt .NET Framework war und du es auf .NET umstellst, kann es passieren, dass einige Funktionen, wie System.Windows.Forms, nicht auf Linux laufen, da diese für Windows alleine sind. Ich habe zum Beispiel derzeit ein .NET Framework Projekt in benutzung, dass hat keine Windows spezifischen Funktionen und läuft deshalb auch auf Linux, nach dem Anbinden an .NET 7

1
Palladin007  20.07.2023, 20:21
@FaTech
<TargetFramework>net7.0</TargetFramework>

Nur, wenn man kein .NET Framework hatte.
Es gibt meine ich ein Migrations-Tool, oder man erstellt das Projekt selber neu, was aber leider je nach Sonderlocken mehr oder weniger aufwändig sein kann.

kann es passieren, dass einige Funktionen, wie System.Windows.Forms, nicht auf Linux laufen

Das ging doch auch vorher nicht? Ich finde den Satz komisch :D
Aber klar, WinForms läuft auf Linux nicht.

Viel spannender ist aber, dass die Templates zwischen .NET Framework und .NET sich unterscheiden, man kann also nicht einfach 1zu1 migrieren, man muss schon die Doku dazu lesen.

0
Palladin007  20.07.2023, 20:18
Du kannst eine alte Bibliothek in ein neues Projekt einbinden

Jein

Ich denke dabei an die Umstellung seit 2016, vor bzw. danach ist das nicht kompatibel. Solange man diese Umstellung aber nicht kreuzt, ist es schon kompatibel.

Neue BCL, neue Runtime, das geht nicht reibungslos.

Beim direkten Kompilieren von altem Code sollte es aber Fehler werfen.

Man kann Glück haben, dass es läuft. Die Sprach-Funktionen gibt es weiterhin und solange man keine geänderten BCL Inhalte nutzt, sollte der Compiler zufrieden sein.

0