Einleitung: Das Labyrinth der .NET-Bibliotheken
\n\nWenn Sie jemals ein neues Projekt in Visual Studio oder Rider erstellt haben, sind Ihnen sicherlich zwei ähnliche, aber verwirrende Vorlagen begegnet: Class Library (.NET Core) und Class Library (.NET Standard). Es stellt sich die berechtigte Frage: „Wo liegt eigentlich der Unterschied? Und was soll ich wählen, damit ich später nicht alles von Grund auf neu schreiben muss?“.
\n\nDies ist nicht nur eine akademische Frage. Auf Stack Overflow hat diese Frage tausende Aufrufe gesammelt, und die Verwirrung zwischen diesen beiden Projekttypen ist einer der häufigsten Fehler von Anfängern. In diesem Artikel werden wir dieses Dilemma ein für alle Mal klären, uns reale Codebeispiele in C# ansehen und herausfinden, welcher Bibliothekstyp für Ihre spezifische Aufgabe geeignet ist.
\n\n1. Ein kurzer historischer Exkurs: Vom .NET Framework zur Ära der Vereinheitlichung
\n\nUm den Unterschied zu verstehen, müssen wir uns daran erinnern, wie sich die Plattform entwickelt hat. Früher gab es nur das .NET Framework – eine monolithische Umgebung für Windows. Dann kam .NET Core – eine plattformübergreifende, leichtgewichtige Version. Und hier entstand ein Problem: Wie schreibt man eine Bibliothek, die sowohl dort als auch dort funktioniert? Dafür wurde .NET Standard entwickelt – eine formale Spezifikation von APIs, die in allen .NET-Implementierungen garantiert vorhanden sind.
\n\nMit der Veröffentlichung von .NET 5 (und später .NET 6, 7, 8) hat Microsoft die Plattformen jedoch vereinheitlicht. Jetzt gibt es eine einheitliche Basisklasse – .NET (früher .NET Core). Dies hat die Spielregeln stark verändert. Lassen Sie uns analysieren, was das für uns Entwickler bedeutet.
2. Was ist eine Class Library (.NET Standard)?
\n\n.NET Standard ist keine Laufzeitumgebung, sondern eine Reihe von Verträgen. Stellen Sie es sich als „universellen Adapter“ vor. Wenn Sie eine Bibliothek erstellen, die auf netstandard2.0 abzielt, kann sie funktionieren:
- \n
- In .NET Framework 4.6.1+ \n
- In .NET Core 2.0+ \n
- In .NET 5/6/7/8 \n
- In Xamarin, Mono, Unity und sogar in UWP \n
Dies ist die ideale Wahl, wenn Sie eine maximale Plattformabdeckung benötigen. Sie schreiben den Code einmal – und er funktioniert überall, wo diese Version des Standards unterstützt wird.
\n\nCodebeispiel für eine .NET Standard-Bibliothek
\n\nErstellen wir eine einfache Bibliothek für die Arbeit mit Zeichenketten, die auf netstandard2.0 abzielt:
// StringHelper.cs\nusing System;\nusing System.Text.RegularExpressions;\n\nnamespace MyStandardLibrary\n{\n public class StringHelper\n {\n /// <summary>\n /// Entfernt alle HTML-Tags aus einer Zeichenkette.\n /// </summary>\n public static string StripHtmlTags(string input)\n {\n if (string.IsNullOrEmpty(input))\n return string.Empty;\n\n // Einfacher, aber effektiver Regex zum Entfernen von Tags\n return Regex.Replace(input, "<.*?>", string.Empty);\n }\n\n /// <summary>\n /// Dreht eine Zeichenkette um.\n /// </summary>\n public static string ReverseString(string input)\n {\n if (string.IsNullOrEmpty(input))\n return string.Empty;\n\n char[] chars = input.ToCharArray();\n Array.Reverse(chars);\n return new string(chars);\n }\n }\n}\n\nBeachten Sie: Wir verwenden nur Basisklassen (System, System.Text.RegularExpressions), die in allen Implementierungen von .NET Standard 2.0 garantiert vorhanden sind. Diese Bibliothek wird sogar in einem Projekt mit .NET Framework 4.6.1 funktionieren, das von Microsoft nicht mehr weiterentwickelt wird, aber im Unternehmenssektor immer noch verwendet wird.
3. Was ist eine Class Library (.NET Core / .NET)?
\n\nWenn Sie .NET Core Class Library (oder einfach .NET Class Library, wenn Sie .NET 5+ haben) wählen, binden Sie sich an eine bestimmte Implementierung der Plattform. In der Projektdatei (csproj) werden Sie so etwas wie <Target sehen.