.NET Standard

.NET Standard to formalna specyfikacja interfejsów API platformy .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óre eliminuje potrzebę korzystania z platformy .NET Standard w większości scenariuszy. Jeśli jednak chcesz udostępnić kod między programem .NET Framework i 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 i wszystkie nowsze 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 oparta 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 nowszej).

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ęcej miejscach.

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
Technologia .NET i .NET Core 1.0, 1.1, 2.0, 2.1, 2.2, 3.0, 3.1, 5.0, 6.0, 7.0, 8.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 zapoznać się z tabelą interaktywną, 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 musisz obsługiwać platformę .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 Międzyplatformowe elementy docelowe i .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. Nie ma żadnych zmian powodujących niezgodność między wersjami.
  • Niezmienne: po wysłaniu wersje platformy .NET Standard są zamrożone.

Po wersji 2.1 nie będzie żadnych nowych wersji .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 implementatory 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 deweloperskich (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. Możesz kierować platformę .NET Standard przy użyciu kompaktowego netstandardprogramu 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 jest większa niż dwukrotnie między platformą .NET Standard 1.6 i 2.0.

Metapakiet NETStandard.Library odwołuje się do kompletnego zestawu pakietów NuGet definiujących platformę .NET Standard. Najczęstszym sposobem na cel 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.

Wersje

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 z warstwy Standardowa.

Program .NET Standard nie jest specyficzny dla żadnej implementacji platformy .NET ani nie jest zgodny ze schematem przechowywania wersji dowolnej z tych implementacji.

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

Docelowy program .NET Standard

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

Tryb zgodności programu .NET Framework

Począwszy od platformy .NET Standard 2.0, wprowadzono tryb zgodności programu .NET Framework. 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 programu .NET Framework nie działa we wszystkich projektach, takich jak biblioteki korzystające z interfejsów API programu Windows Presentation Foundation (WPF).

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

Biblioteki .NET Standard i program Visual Studio

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

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

.NET 5+ i .NET Standard

.NET 5, .NET 6, .NET 7 i .NET 8 to pojedyncze produkty z jednolitym zestawem funkcji i interfejsów API, które mogą być używane dla aplikacji klasycznych systemu Windows i aplikacji konsolowych dla wielu platform, usług w chmurze i witryn internetowych. Na przykład programy TFM platformy .NET 8 odzwierciedlają ten szeroki zakres scenariuszy:

  • net8.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 8 zastępuje zarówno programy TFM, net8.0 jak netcoreapp i netstandard TFM.

  • net8.0-windows

    Jest to przykład specyficznego dla systemu operacyjnego serwera TFM , który dodaje funkcję specyficzną dla systemu operacyjnego do wszystkich elementów, do których net8.0 się odnosi.

Kiedy wartość docelowa net8.0 a netstandard

W przypadku istniejącego kodu, który jest przeznaczony netstandarddla programu , nie ma potrzeby zmiany programu TFM na net8.0 lub nowszego serwera TFM. Platforma .NET 8 implementuje program .NET Standard 2.1 i starsze wersje. Jedynym powodem ponownego uzyskania dostępu z platformy .NET Standard do platformy .NET 8+ jest uzyskanie dostępu do większej liczby funkcji środowiska uruchomieniowego, funkcji językowych lub interfejsów API. Aby na przykład użyć języka C# 9, należy użyć platformy .NET 5 lub nowszej wersji. Możesz wielotargetować platformy .NET 8 i .NET Standard, aby uzyskać dostęp do nowszych funkcji i nadal mieć bibliotekę dostępną dla innych implementacji platformy .NET.

Poniżej przedstawiono 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 net8.0. Dla uproszczenia najlepiej zachować wszystkie projekty tworzące aplikację w tej samej wersji platformy .NET. Następnie można założyć, że te same funkcje BCL wszędzie.

  • Biblioteki wielokrotnego użytku

    Jeśli tworzysz biblioteki wielokrotnego użytku, które planujesz dostarczać na nuGet, rozważ kompromis między zestawem funkcji zasięgu i dostępnym. .NET Standard 2.0 to najnowsza wersja obsługiwana przez program .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 musisz obsługiwać programu .NET Framework, możesz korzystać z platformy .NET Standard 2.1 lub .NET 8. Zalecamy pominięcie platformy .NET Standard 2.1 i przejście bezpośrednio do platformy .NET 8. Najczęściej używane biblioteki będą wielokierunkowe zarówno dla platform .NET Standard 2.0, jak 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 znajdują się już na platformie .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 między platformami i obciążeniami:

  • Spowolnienie dodawania nowych interfejsów API

    Platforma .NET Standard została utworzona jako zestaw interfejsów API, który musiałby 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 przegapiła określoną wersję, 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 ono już dostępne dla każdej aplikacji i biblioteki .NET 5+, ponieważ baza kodu jest współużytkowana. Ponieważ nie ma różnicy między specyfikacją interfejsu API a 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ą. Wynikiem jest uproszczony schemat TFM. Istnieje jeden prefiks serwera TFM dla wszystkich obciążeń: net8.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 net8.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 tabela odpowiednikó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.

Program .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 programem .NET Framework i wszystkimi innymi implementacjami platformy .NET.
  • Umożliwia netstandard2.1 udostępnianie kodu między platformami Mono, Xamarin i .NET Core 3.x.

Zobacz też