.NET Standard vs. .NET Core

240

Czytałem o różnicy między .NET Standard i .NET Core, ale tak naprawdę nie wiem, czym jest różnica, ani kiedy wybrać projekt biblioteki .NET Standard i kiedy wybrać projekt biblioteki .NET Core.

Przeczytałem, że .NET Standard ma zapewnić, że zestaw interfejsów API jest zawsze dostępny, bez względu na używaną platformę (o ile ta platforma jest kompatybilna z wybraną wersją .NET Standard). Jeśli się nie mylę, oznacza to, że mogę utworzyć bibliotekę klas .NET Standard, a następnie użyć jej na dowolnej platformie zgodnej z wybraną wersją .NET Standard.

Dzięki .NET Core przeczytałem, że jest on również przeznaczony do użytku na różnych platformach, więc jeśli wybiorę bibliotekę .NET Core, wydaje się, że mogę go używać na wielu platformach, podobnie jak .NET Standard.

Na koniec nie widzę różnicy. Kiedy powinienem użyć które? Jaka jest różnica między nimi?

Álvaro García
źródło
33
W kategoriach kodowych: .net standard = interfejs, .net core = klasa; jeśli kodujesz w stosunku do klasy, nie otrzymujesz więcej metod (itp.), ale jesteś ograniczony do tego konkretnego typu (i potomków); w przypadku korzystania z interfejsu ty może dostać mniejszą powierzchnię, ale to będzie działać przeciwko arbitralnym wdrożeń ... tak długo, jak te implementacje zrobić, czego oczekuje :) tak, .net podstawowe cele wiele platform, ale istnieją inne implementacje .net standard
Marc Gravell
9
.NETStandard jest zamiennikiem PCL. Przenośna biblioteka klas pomogła Ci napisać bibliotekę, która mogłaby działać na więcej niż jednej platformie (telefon, komputer stacjonarny, sklep, przeglądarka, xbox itp.). Nie skalował się zbyt dobrze, cierpiąc bardzo z powodu n! problem, więc go porzucili. .NETCore to tylko pierwsza platforma, którą zrobili, była najłatwiejsza, reszta musi nadrobić zaległości. Należy pamiętać, że jest to bardzo dużo w toku, duże zmiany naprzód w .NETStandard v2.0. Na razie standard rządzenia nimi wszystkimi
Hans Passant
Nie dodawaj dodatkowych pytań do już istniejącego. Twoje pytanie w edycji jest oddzielne od tego.
Jon Skeet
1
@JonSkeet Więc powinienem otworzyć nowe pytanie? Dziękuję za radę. ponieważ na początku otworzyłem nowe zestawienie dotyczące wielu celów .net Core i zostałem odrzucony, ponieważ powiedzieli, że jest to duplikat pytania.
Álvaro García
@ ÁlvaroGarcía: Tak, ale wyjaśnij - twoje obecne pytanie w jednym zdaniu nie jest dla mnie jasne.
Jon Skeet

Odpowiedzi:

195

Spróbuję wyjaśnić twoje wątpliwości i udzielić odpowiedzi Jonowi Skeetowi.

.NET Standard to specyfikacja , więc biblioteka skompilowana dla określonej wersji .NET Standard może być używana w różnych implementacjach .NET Standard.

Jak powiedziano w moim innym komentarzu, dobrą analogią do relacji między .NET Standard i innymi implementacjami .NET Standard (.NET Core, .NET Framework itp.) Jest sedno Davida Fowlera : Wersje .NET Standard są Interfaces, podczas gdy frameworki są implementacje tych interfejsów.

Ten uproszczony schemat może pomóc zrozumieć ten związek:

Analogia interfejsów standardowych NET

Wszystkie elementy docelowe NetCore10mają dostęp do INetStandard15interfejsów API i NetCore10 określonych interfejsów API (takich jak DotNetHostPolicy).

Oczywiście tej biblioteki nie można używać w różnych INetStandard15implementacjach ( NetCore10nie można jej konwertować na NetFramework462lub Mono46).

Jeśli zamiast tego potrzebują dostępu tylko do INetStandard15API (a target że specyfikacja zamiast ramy betonowej) biblioteki mogą być wykorzystane przez dowolną ramach którego Realizuje ( NetCore10, NetFramework462etc.)

Uwaga: w oryginalnej analogii David Fowler używał interfejsów zarówno dla wersji .NET Standard, jak i implementacji frameworków. Uważam, że używanie interfejsów i klas jest bardziej intuicyjne i lepiej odzwierciedla związek między specyfikacjami a konkretnymi implementacjami.

Federico Dipuma
źródło
2
Wielkie dzięki za to. Ale mam wątpliwości. Jeśli .net standard jest interfejsem i można go zaimplementować np. Z .NET Framework i .net Core, to kiedy tworzę bibliotekę klas standardowych .net i używam tej biblioteki w innym projekcie, jakiej implementacji używa .NET Framework lub .net Rdzeń?
Álvaro García
8
Wykorzysta implementację skompilowanej aplikacji (cokolwiek to jest). Jeśli skompilujesz aplikację podstawową NET, będzie korzystała z bibliotek podstawowych NET (które są implementacją standardu NET)
Federico Dipuma,
5
Ten schemat jest fantastyczną pomocą w zilustrowaniu zależności rdzeń / std / framework.
jasper
Więc jeśli utworzę aplikację konsolową net461 i celuję w bibliotekę netstandard2.0, nic z tej standardowej biblioteki nie rozwiązuje się w aplikacji konsolowej. Więc... ??
Sinaesthetic
2
Zdjęcie jest warte tysiąca słów
Nikaas
182

.NET Core to implementacja standardu .NET. Jest dostępny w wielu systemach operacyjnych, ale to nie to samo - istnieją również inne implementacje .NET Standard.

Jeśli więc utworzysz bibliotekę .NET Core, będzie ona miała dostęp do rzeczy, które są zaimplementowane w .NET Core, ale nie są częścią .NET Standard, a twoja biblioteka nie będzie kompatybilna z innymi implementacjami .NET Standard, takie jak Xamarin, Tizen, pełne środowisko pulpitu .NET itp.

W skrócie: aby osiągnąć maksymalną przenośność, ustaw bibliotekę na .NET Standard.

Jon Skeet
źródło
5
@ ÁlvaroGarcía: Co rozumiesz przez „to” powinno być kompatybilne? .NET Core 1.0? Niekoniecznie - ponieważ .NET Core 1.0 może nadal zawierać dodatkowe rzeczy. Ten wpis oznacza, że ​​jeśli celujesz w .NET Standard 1.6, możesz uruchomić kod zarówno w Mono 4.6, jak i .NET Core 1.0.
Jon Skeet
4
Nie można uruchomić zestawu .NET Core na niczym innym niż .NET Core (CoreCLR i CoreFX). Możesz uruchomić zestaw .NET Standard na dowolnej platformie, która spełnia zobowiązania umowne dla odpowiedniego standardu (1.3, 1.6, 2.0 itd.).
Mark Rendle,
2
Wiele platform odnosi się do systemu operacyjnego, a nie frameworka.
Mark Rendle,
15
Jako analogię spróbuj wyobrazić sobie .NET Standard jako interfejs (np INetStandard16.). Implementowane są .NET Core 1.0 i Mono 4.6 INetStandard16. Nie można przekonwertować .Net Core 1.0 na Mono 4.6 (i odwrotnie), ale wszystko, co używa, INetStandard16będzie działać na oba. (
podziękowania
6
Zaskoczyło mnie to. Nazwy wydają się odwrócone. Można by pomyśleć, że coś o nazwie „rdzeń” byłoby bardziej minimalnym z dwóch ...
jpmc26
6

Biblioteka .NET Core Class jest zasadniczo podzbiorem biblioteki .NET Framework, która zawiera tylko mniej interfejsów API. Trzymanie się biblioteki .NET Core Class utrudnia współużytkowanie kodu między środowiskami wykonawczymi. Ten kod może nie działać dla innego środowiska wykonawczego (Mono dla Xamarin), ponieważ nie ma potrzebnego interfejsu API. Aby rozwiązać ten problem, istnieje .NET Standard, który jest po prostu zestawem specyfikacji, który mówi ci, jakich interfejsów API możesz użyć . Głównym celem .NET Standard jest współdzielenie kodu między środowiskami wykonawczymi. Ważne jest, aby ta specyfikacja była implementowana przez wszystkie środowiska wykonawcze. (.NET Framework, .NET Core i Mono dla Xamarin).

Więc jeśli masz pewność, że będziesz używać swojej biblioteki tylko do projektów .NET Core, możesz zignorować .NET Standard, ale jeśli istnieje nawet niewielka szansa, że ​​twój kod będzie używany przez .NET Framework lub Mono dla Xamarin, to lepiej trzymać się standardu .NET

Należy również pamiętać, że wyższe wersje .NET Standard zawierają więcej interfejsów API, ale niższe wersje są obsługiwane przez więcej platform. Dlatego jeśli utworzysz bibliotekę .NET Standard, którą chcesz udostępniać między środowiskami wykonawczymi, wybierz docelową najniższą wersję , jaką możesz uzyskać , co pomoże Ci dotrzeć do większości platform. Na przykład, jeśli chcesz uruchomić .NET Framework 4.5 i .NET Core 1.0, najwyższą dostępną wersją .NET Standard jest .NET Standard 1.1. Więcej informacji na ten temat można znaleźć w tej wspaniałej tabeli z dokumentacji .

PS: Również jeśli chcesz przekonwertować swoją bibliotekę do .NET Standard, narzędzie .NET Portability Analyzer może ci w tym pomóc.

użytkownik2771704
źródło
4

.NET Standard to specyfikacja interfejsów API .NET, które mają być dostępne w implementacjach .NET. Umożliwia to zdefiniowanie jednolitego zestawu interfejsów API BCL dla wszystkich implementacji .NET.

.NET Core jest jedną z takich implementacji .NET Standard. .NET Framework to kolejna implementacja standardu .NET.

Zdjęcie z bloga .NET

wprowadź opis zdjęcia tutaj

Odpowiedź Federicos daje graficzny przegląd ewolucji każdego frameworka wraz z wersjami. Spójrz na poniższy schemat z Dokumentów Microsoft .

wprowadź opis zdjęcia tutaj

Kierowanie na .NET Standard zwiększa obsługę platformy, natomiast kierowanie na konkretną platformę .NET, taką jak .NET Core (lub .NET Framework), umożliwia korzystanie ze wszystkich funkcji platformy dla tej platformy.

Nipuna
źródło
2

.NET Standard to specyfikacja interfejsów API, które muszą zapewnić wszystkie implementacje .NET. Zapewnia spójność rodzinie .NET i umożliwia tworzenie bibliotek, których można używać z dowolnej implementacji .NET. Zastępuje PCL do budowy współdzielonych komponentów.

.NET Core to implementacja standardu .NET zoptymalizowana pod kątem tworzenia aplikacji konsolowych, aplikacji internetowych i usług w chmurze przy użyciu programu ASP.NET Core. Zestaw SDK jest wyposażony w potężne narzędzie, które oprócz programowania Visual Studio obsługuje pełny przepływ pracy programowania oparty na wierszu poleceń. Możesz dowiedzieć się więcej o nich na stronie aka.ms/netstandardfaq i aka.ms/netcore .


Powyższe, wraz z bardzo jasnym wyjaśnieniem większości rzeczy omówionych w tym pytaniu, można znaleźć w następującym niezwykle pomocnym artykule Microsoft (MSDN - wrzesień 2017 r.): .NET Standard - Demystifying .NET Core i .NET Standard

steliosalex
źródło
0

Miałeś na myśli .NET Framework? Ponieważ standard .NET to implementacje, takie jak .NET Framework, .NET Core i Xamarin.

Uwielbiam .NET Core, ponieważ możemy go hostować w systemie Linux (używam nginx z mojego doświadczenia). Różni się od platformy .NET, którą można hostować tylko w IIS. W takim przypadku możesz rozważyć budżet hostingowy (ponieważ serwer Windows jest dla mnie drogi).

W perspektywie środowiska programistycznego rdzeń .Net jest lekki. Możesz więc użyć VSCode, Sublime, dla IDE (nie tylko studio wizualne).

Fityan Aula
źródło
0

Mówiąc najprościej, standard .NET służy do pisania projektów bibliotek klas, które kompilują się do biblioteki dll. .NET Core może być wykorzystywany do tworzenia rzeczywistych aplikacji internetowych, które mogą działać we wszystkich systemach operacyjnych (Windows, Linux, MacOS). (W .NET Core 3 Microsoft zapewnia funkcjonalność do tworzenia aplikacji komputerowych przy użyciu WPF, ale do tej pory te aplikacje nie będą działały na różnych platformach i będą działały tylko w systemie Windows. W przyszłości Microsoft może uczynić je również wieloplatformowymi). bibliotek / bibliotek DLL można używać w dowolnej aplikacji korzystającej z .NET (.NET Framework, .NET Core), co oznacza, że ​​możesz używać standardu .NET zarówno z .NET Framework, jak i .NET core.

Waleed Naveed
źródło