.NET Standard

.NET Standard to formalna specyfikacja interfejsów API .NET, które są dostępne w wielu implementacjach platformy .NET. Motywacją platformy .NET Standard było ustanowienie większej jednolitości w ekosystemie platformy .NET. Platforma .NET 5 i nowsze wersje przyjmują inne podejście do ustanawiania jednolitości, która eliminuje potrzebę korzystania z platformy .NET Standard w większości scenariuszy. Jeśli jednak chcesz udostępnić kod między .NET Framework a inną implementacją platformy .NET, taką jak .NET Core, biblioteka powinna być docelowa dla platformy .NET Standard 2.0. Nie zostaną wydane żadne nowe wersje platformy .NET Standard, ale platforma .NET 5, .NET 6 i wszystkie przyszłe wersje będą nadal obsługiwać platformę .NET Standard 2.1 i starsze.

Aby uzyskać informacje na temat wybierania między platformami .NET 5+ i .NET Standard, zobacz .NET 5+ i .NET Standard w dalszej części tego artykułu.

Wersje platformy .NET Standard

Wersja platformy .NET Standard. Każda nowa wersja dodaje więcej interfejsów API. Gdy biblioteka jest zbudowana na określonej wersji platformy .NET Standard, może działać w dowolnej implementacji platformy .NET, która implementuje tę wersję platformy .NET Standard (lub nowszą).

Ukierunkowanie na wyższą wersję platformy .NET Standard umożliwia bibliotece korzystanie z większej liczby interfejsów API, ale oznacza, że może być używana tylko w nowszych wersjach platformy .NET. Określanie wersji niższej zmniejsza dostępne interfejsy API, ale oznacza, że biblioteka może działać w większej ilości miejsc.

Wybierz wersję platformy .NET Standard

Platforma .NET Standard 1.0 ma 7949 z 37 118 dostępnych interfejsów API.

Implementacja platformy .NET Obsługa wersji
.NET i .NET Core 1.0, 1.1, 2.0, 2.1, 2.2, 3.0, 3.1, 5.0, 6.0, 7.0
.NET Framework 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
Mono 4.6, 5.4, 6.4
Xamarin.iOS 10.0, 10.14, 12.16
Xamarin.Mac 3.0, 3.8, 5.16
Xamarin.Android 7.0, 8.0, 10.0
Platforma uniwersalna systemu Windows 8.0, 8.1, 10.0, 10.0.16299, TBD
Unity 2018.1

Aby uzyskać więcej informacji, zobacz .NET Standard 1.0. Aby uzyskać interaktywną tabelę, zobacz wersje platformy .NET Standard.

Która wersja platformy .NET Standard ma być docelowa

Zalecamy korzystanie z platformy .NET Standard 2.0, chyba że musisz obsługiwać starszą wersję. Większość bibliotek ogólnego przeznaczenia nie powinna potrzebować interfejsów API spoza platformy .NET Standard 2.0. Platforma .NET Standard 2.0 jest obsługiwana przez wszystkie nowoczesne platformy i jest zalecanym sposobem obsługi wielu platform z jednym celem.

Jeśli potrzebujesz obsługi platformy .NET Standard 1.x, zalecamy również użycie platformy .NET Standard 2.0. Platforma .NET Standard 1.x jest dystrybuowana jako szczegółowy zestaw pakietów NuGet, który tworzy duży graf zależności pakietów i powoduje, że deweloperzy pobierają wiele pakietów podczas kompilowania. Aby uzyskać więcej informacji, zobacz Obsługa wielu platform i platforma .NET 5+ i .NET Standard w dalszej części tego artykułu.

Reguły przechowywania wersji platformy .NET Standard

Istnieją dwie podstawowe reguły przechowywania wersji:

  • Addytywne: wersje platformy .NET Standard są logicznie koncentrycznymi okręgami: wyższe wersje zawierają wszystkie interfejsy API z poprzednich wersji. Między wersjami nie ma żadnych zmian powodujących niezgodność.
  • Niezmienne: po wysłaniu wersje platformy .NET Standard są zamrożone.

Po wersji 2.1 nie będzie żadnych nowych wersji platformy .NET Standard. Aby uzyskać więcej informacji, zobacz .NET 5+ i .NET Standard w dalszej części tego artykułu.

Specyfikacja

Specyfikacja platformy .NET Standard to ustandaryzowany zestaw interfejsów API. Specyfikacja jest utrzymywana przez implementacje platformy .NET, w szczególności firmy Microsoft (w tym .NET Framework, .NET Core i Mono) i Unity.

Oficjalne artefakty

Oficjalna specyfikacja to zestaw plików cs definiujących interfejsy API, które są częścią standardu. Katalog ref w repozytorium dotnet/standard (teraz zarchiwizowane) definiuje interfejsy API platformy .NET Standard.

Metapakiet biblioteki NETStandard.Library (źródło) opisuje zestaw bibliotek definiujących (częściowo) co najmniej jedną wersję platformy .NET Standard.

Dany składnik, taki jak System.Runtime, opisuje:

  • Część platformy .NET Standard (tylko jej zakres).
  • Wiele wersji platformy .NET Standard dla tego zakresu.

Artefakty pochodne są udostępniane w celu umożliwienia wygodniejszego odczytywania i włączania niektórych scenariuszy dla deweloperów (na przykład przy użyciu kompilatora).

Reprezentacja pakietu

Podstawowym pojazdem dystrybucji dla zestawów referencyjnych platformy .NET Standard są pakiety NuGet. Implementacje są dostarczane na różne sposoby, odpowiednie dla każdej implementacji platformy .NET.

Pakiety NuGet są przeznaczone dla co najmniej jednej platformy. Pakiety .NET Standard są przeznaczone dla platformy ".NET Standard". Platformę .NET Standard można kierować przy użyciu kompaktowego programu netstandard TFM (na przykład netstandard1.4). Biblioteki przeznaczone do uruchamiania w wielu implementacjach platformy .NET powinny być przeznaczone dla tej platformy. W przypadku najszerszego zestawu interfejsów API docelowa netstandard2.0 liczba dostępnych interfejsów API przekracza dwukrotność między platformą .NET Standard 1.6 i 2.0.

Metapackage NETStandard.Library odwołuje się do pełnego zestawu pakietów NuGet definiujących platformę .NET Standard. Najczęstszym sposobem określania celu netstandard jest odwoływanie się do tego metapakietu. Opisuje ona i zapewnia dostęp do bibliotek .NET ~40 i skojarzonych interfejsów API definiujących platformę .NET Standard. Możesz odwołać się do dodatkowych pakietów przeznaczonych netstandard do uzyskania dostępu do dodatkowych interfejsów API.

Przechowywanie wersji

Specyfikacja nie jest pojedyncza, ale liniowo wersjonowany zestaw interfejsów API. Pierwsza wersja standardu ustanawia zestaw punktów odniesienia interfejsów API. Kolejne wersje dodają interfejsy API i dziedziczą interfejsy API zdefiniowane przez poprzednie wersje. Nie ma ustalonej aprowizacji usuwania interfejsów API ze standardu.

Platforma .NET Standard nie jest specyficzna dla żadnej implementacji platformy .NET ani nie jest zgodna ze schematem przechowywania wersji dowolnej z tych implementacji.

Jak wspomniano wcześniej, nie będzie żadnych nowych wersji .NET Standard po wersji 2.1.

Docelowa platforma .NET Standard

Biblioteki platformy .NET Standard można tworzyć przy użyciu kombinacji netstandard struktury i NETStandard.Library metapakiet.

.NET Framework tryb zgodności

Począwszy od platformy .NET Standard 2.0, wprowadzono .NET Framework tryb zgodności. Ten tryb zgodności umożliwia projektom platformy .NET Standard odwołanie do bibliotek .NET Framework tak, jakby zostały skompilowane dla platformy .NET Standard. Odwoływanie się do bibliotek .NET Framework nie działa we wszystkich projektach, takich jak biblioteki korzystające z interfejsów API Windows Presentation Foundation (WPF).

Aby uzyskać więcej informacji, zobacz .NET Framework tryb zgodności.

Biblioteki platformy .NET Standard i program Visual Studio

Aby skompilować biblioteki .NET Standard w programie Visual Studio, upewnij się, że masz zainstalowany program Visual Studio 2022, Visual Studio 2019 lub VisualStudio 2017 w wersji 15.3 lub nowszej w systemie Windows lub Visual Studio dla komputerów Mac w wersji 7.1 lub nowszej zainstalowanej w systemie macOS.

Jeśli potrzebujesz tylko bibliotek .NET Standard 2.0 w projektach, możesz to zrobić również w programie Visual Studio 2015. Musisz jednak zainstalować klienta NuGet w wersji 3.6 lub nowszej. Klient NuGet dla programu Visual Studio 2015 można pobrać ze strony pobierania NuGet .

.NET 5+ i .NET Standard

Platformy .NET 5 i .NET 6 to pojedyncze produkty z jednolitym zestawem możliwości i interfejsów API, które mogą być używane dla aplikacji klasycznych systemu Windows i aplikacji konsolowych międzyplatformowych, usług w chmurze i witryn internetowych. Na przykład programy TFM platformy .NET 5 odzwierciedlają ten szeroki zakres scenariuszy:

  • net5.0

    Ten program TFM jest przeznaczony dla kodu, który działa wszędzie. Z kilkoma wyjątkami obejmuje tylko technologie, które działają międzyplatformowo. W przypadku kodu platformy .NET 5 zastępuje zarówno programy TFM, net5.0 jak netcoreapp i netstandard TFM.

  • net5.0-windows

    Jest to przykład specyficznego dla systemu operacyjnego serwera TFM , który dodaje funkcję specyficzną dla systemu operacyjnego do wszystkiego, do czego net5.0 się odwołuje.

Kiedy wartość docelowa net5.0 lub net6.0 a netstandard

W przypadku istniejącego kodu, który jest przeznaczony dla netstandardprogramu , nie trzeba zmieniać serwera TFM na net5.0 lub net6.0. Programy .NET 5 i .NET 6 implementują platformę .NET Standard 2.1 i starsze. Jedynym powodem retarget z platformy .NET Standard do platformy .NET 5+ jest uzyskanie dostępu do większej liczby funkcji środowiska uruchomieniowego, funkcji języka lub interfejsów API. Na przykład aby można było używać języka C# 9, należy użyć platformy .NET 5 lub nowszej wersji. Możesz korzystać z wielotargetowych platform .NET 5 lub .NET 6 i .NET Standard, aby uzyskać dostęp do nowszych funkcji i nadal mieć bibliotekę dostępną dla innych implementacji platformy .NET.

Oto kilka wskazówek dotyczących nowego kodu dla platformy .NET 5+:

  • Składniki aplikacji

    Jeśli używasz bibliotek do dzielenia aplikacji na kilka składników, zalecamy użycie elementu docelowego net5.0 lub net6.0. Dla uproszczenia najlepiej zachować wszystkie projekty tworzące aplikację w tej samej wersji platformy .NET. Następnie można założyć te same funkcje listy BCL wszędzie.

  • Biblioteki wielokrotnego użytku

    Jeśli tworzysz biblioteki wielokrotnego użytku, które planujesz dostarczyć na nuGet, rozważ kompromis między zasięgiem i dostępnym zestawem funkcji. .NET Standard 2.0 to najnowsza wersja obsługiwana przez .NET Framework, dzięki czemu zapewnia dobry zasięg z dość dużym zestawem funkcji. Nie zalecamy określania wartości docelowej dla platformy .NET Standard 1.x, ponieważ ograniczysz dostępny zestaw funkcji dla minimalnego wzrostu zasięgu.

    Jeśli nie potrzebujesz obsługi .NET Framework, możesz użyć platformy .NET Standard 2.1 lub .NET 5/6. Zalecamy pominięcie platformy .NET Standard 2.1 i przejście bezpośrednio do platformy .NET 6. Najczęściej używane biblioteki będą wielowersyjne dla platformy .NET Standard 2.0 i .NET 5+. Obsługa platformy .NET Standard 2.0 zapewnia największy zasięg, a obsługa platformy .NET 5+ zapewnia możliwość korzystania z najnowszych funkcji platformy dla klientów, którzy już korzystają z platformy .NET 5+.

Problemy z platformą .NET Standard

Poniżej przedstawiono niektóre problemy z platformą .NET Standard, które pomagają wyjaśnić, dlaczego platforma .NET 5 i nowsze wersje to lepszy sposób udostępniania kodu na różnych platformach i obciążeniach:

  • Spowolnienie dodawania nowych interfejsów API

    Platforma .NET Standard została utworzona jako zestaw interfejsów API, który będzie musiał obsługiwać wszystkie implementacje platformy .NET, więc istniał proces przeglądu propozycji dodawania nowych interfejsów API. Celem było standaryzacja tylko interfejsów API, które można zaimplementować na wszystkich bieżących i przyszłych platformach .NET. Wynikiem było to, że jeśli funkcja nie została pominięta w określonej wersji, może być konieczne odczekać kilka lat, zanim została dodana do wersji standardu. Następnie poczekaj jeszcze dłużej, aż nowa wersja platformy .NET Standard będzie powszechnie obsługiwana.

    Rozwiązanie na platformie .NET 5+: Po zaimplementowaniu funkcji jest ona już dostępna dla każdej aplikacji i biblioteki platformy .NET 5+, ponieważ baza kodu jest udostępniana. Ponieważ nie ma różnicy między specyfikacją interfejsu API i jego implementacją, możesz korzystać z nowych funkcji znacznie szybciej niż w przypadku platformy .NET Standard.

  • Przechowywanie wersji złożonych

    Rozdzielenie specyfikacji interfejsu API od jej implementacji powoduje złożone mapowanie między wersjami specyfikacji interfejsu API i wersjami implementacji. Ta złożoność jest widoczna w tabeli przedstawionej wcześniej w tym artykule oraz instrukcje dotyczące interpretowania jej.

    Rozwiązanie na platformie .NET 5+: Nie ma separacji między specyfikacją interfejsu API .NET 5+ a jej implementacją. Rezultatem jest uproszczony schemat TFM. Istnieje jeden prefiks TFM dla wszystkich obciążeń: net5.0 lub net6.0 jest używany dla bibliotek, aplikacji konsolowych i aplikacji internetowych. Jedyną odmianą jest sufiks określający interfejsy API specyficzne dla danej platformy , takie jak net5.0-windows lub net6.0-windows. Dzięki tej konwencji nazewnictwa TFM można łatwo określić, czy dana aplikacja może używać danej biblioteki. Nie jest wymagana żadna tabela równoważników numerów wersji, taka jak ta dla platformy .NET Standard.

  • Nieobsługiwane wyjątki platformy w czasie wykonywania

    Platforma .NET Standard uwidacznia interfejsy API specyficzne dla platformy. Kod może być kompilowany bez błędów i wydaje się być przenośny do dowolnej platformy, nawet jeśli nie jest przenośny. Po uruchomieniu na platformie, która nie ma implementacji dla danego interfejsu API, występują błędy czasu wykonywania.

    Rozwiązanie na platformie .NET 5+: Zestawy SDK platformy .NET 5+ zawierają analizatory kodu, które są domyślnie włączone. Analizator zgodności platformy wykrywa niezamierzone użycie interfejsów API, które nie są obsługiwane na platformach, na których zamierzasz działać. Aby uzyskać więcej informacji, zobacz Analizator zgodności platformy.

.NET Standard nie jest przestarzały

Platforma .NET Standard jest nadal potrzebna w przypadku bibliotek, które mogą być używane przez wiele implementacji platformy .NET. Zalecamy użycie platformy .NET Standard w następujących scenariuszach:

  • Służy netstandard2.0 do udostępniania kodu między .NET Framework a wszystkimi innymi implementacjami platformy .NET.
  • Umożliwia netstandard2.1 udostępnianie kodu między platformami Mono, Xamarin i .NET Core 3.x.

Zobacz też