.NET Standard vs .NET Core

240

Saya telah membaca tentang perbedaan antara .NET Standard dan .NET Core, tetapi saya benar-benar tidak tahu apa bedanya, atau kapan harus memilih proyek perpustakaan .NET Standard dan kapan harus memilih proyek perpustakaan .NET Core.

Saya telah membaca bahwa .NET Standard adalah untuk memastikan bahwa satu set API selalu tersedia, apa pun platform yang digunakan (selama platform tersebut kompatibel dengan versi .NET Standard yang saya pilih). Jika saya tidak salah, ini berarti bahwa saya dapat membuat perpustakaan kelas .NET Standard dan kemudian menggunakannya pada platform apa pun yang kompatibel dengan versi .NET Standard yang saya pilih.

Dengan .NET Core, saya telah membaca bahwa ini dimaksudkan untuk penggunaan lintas platform juga, jadi jika saya memilih perpustakaan .NET Core sepertinya saya dapat menggunakannya pada banyak platform juga, seperti halnya .NET Standard.

Jadi pada akhirnya, saya tidak melihat perbedaannya. Kapan saya harus menggunakan yang mana? Apa perbedaan di antara mereka?

Álvaro García
sumber
33
Dalam istilah kode: .net standard = interface, .net core = class; jika Anda kode terhadap kelas Anda tidak akan mendapatkan lebih banyak metode (dll), tetapi Anda dibatasi untuk tipe konkret (dan keturunan); jika Anda menggunakan antarmuka Anda mungkin mendapatkan permukaan yang lebih kecil, tetapi itu akan bekerja melawan implementasi sewenang-wenang ... selama implementasi tersebut melakukan apa yang diharapkan :) ya, .net core menargetkan beberapa platform, tetapi ada implementasi lain dari .net standard
Marc Gravell
9
.NETStandard adalah pengganti PCL. Pustaka Kelas Portable membantu Anda menulis pustaka yang dapat berjalan di lebih dari satu platform (telepon, desktop, toko, browser, xbox, dll). Itu tidak skala dengan sangat baik, sangat menderita dari n! masalah, jadi mereka meninggalkannya. .NETCore hanyalah kerangka pertama yang mereka kerjakan, itu yang termudah, sisanya harus menyusul. Perlu diingat bahwa ini sangat banyak pekerjaan yang sedang berjalan, perubahan besar di depan dengan .NETStandard v2.0. Standar untuk memerintah mereka semua, untuk saat ini :)
Hans Passant
Tolong jangan tambahkan pertanyaan tambahan ke yang sudah ada. Pertanyaan Anda di edit terpisah untuk ini.
Jon Skeet
1
@ JonSkeet Maka saya harus membuka pertanyaan baru? Terima kasih atas sarannya. karena pada awalnya saya telah membuka pertanyaan baru tentang .net Core multi target dan saya telah downvoted karena mereka mengatakan itu adalah pertanyaan rangkap.
Álvaro García
@ ÁlvaroGarcía: Ya, tapi jelaskan - pertanyaan satu kalimat Anda saat ini sama sekali tidak jelas bagi saya.
Jon Skeet

Jawaban:

195

Saya akan mencoba untuk lebih memperjelas keraguan Anda dan memperluas jawaban Jon Skeet.

.NET Standard adalah spesifikasi , sehingga pustaka yang dikompilasi untuk versi .NET Standard tertentu dapat digunakan dalam implementasi .NET Standard yang berbeda.

Seperti yang dikatakan dalam komentar saya yang lain, analogi yang baik untuk hubungan antara .NET Standard dan .NET Standard Implementations lainnya (.NET Core, .NET Framework, dll.) Adalah inti dari David Fowler : Versi .NET Standard adalah Interfaces, sedangkan framework adalah implementasi dari antarmuka tersebut.

Diagram yang disederhanakan ini dapat membantu memahami hubungan ini:

Analogi Antarmuka Standar NET

Penargetan apa pun NetCore10memiliki akses ke INetStandard15API dan API NetCore10 tertentu (seperti DotNetHostPolicy).

Tentu saja perpustakaan ini tidak dapat digunakan dalam INetStandard15implementasi yang berbeda ( NetCore10tidak dapat dikonversi ke NetFramework462atau Mono46).

Jika Anda, sebagai gantinya, kebutuhan akses hanya untuk INetStandard15API (dan target itu spesifikasi bukannya kerangka beton) perpustakaan dapat digunakan oleh setiap kerangka yang menerapkan itu ( NetCore10, NetFramework462, dll)

Catatan: dalam analogi asli David Fowler menggunakan antarmuka untuk versi .NET standar dan implementasi kerangka kerja. Saya percaya bahwa menggunakan antarmuka dan kelas, sebaliknya, lebih intuitif dan lebih baik mewakili hubungan antara spesifikasi dan implementasi konkret.

Federico Dipuma
sumber
2
Terima kasih banyak atas ini. Tapi saya ragu. Jika standar .net adalah antarmuka dan dapat diimplementasikan misalnya dengan .net framework dan .net Core, ketika saya membuat perpustakaan kelas standar .net dan saya menggunakan perpustakaan ini di proyek lain, apa implementasi yang digunakan, kerangka kerja bersih atau .net Inti?
Álvaro García
8
Ini akan menggunakan implementasi aplikasi yang dikompilasi (apa pun itu). Jika Anda mengompilasi aplikasi inti NET maka itu akan menggunakan perpustakaan inti NET (yang merupakan implementasi dari standar NET)
Federico Dipuma
5
Diagram itu adalah bantuan luar biasa dalam menggambarkan hubungan inti / std / kerangka kerja.
jasper
Jadi, jika saya membuat aplikasi konsol net461 dan menargetkan pustaka netstandard2.0, tidak ada yang dari lib standar yang diselesaikan di aplikasi konsol. Jadi ... ??
Sinaesthetic
2
Sebuah gambar bernilai seribu kata
Nikaas
182

.NET Core adalah implementasi dari .NET Standard. Ini tersedia pada banyak sistem operasi, tetapi itu bukan hal yang sama - ada implementasi lain dari .NET Standard juga.

Jadi jika Anda membuat perpustakaan .NET Core, itu akan memiliki akses ke hal-hal yang diimplementasikan di .NET Core, tetapi bukan bagian dari .NET Standard, dan perpustakaan Anda tidak akan kompatibel dengan implementasi lain dari .NET Standard, seperti Xamarin, Tizen, kerangka desktop .NET penuh dll.

Singkatnya: untuk mencapai portabilitas maksimum, buat target perpustakaan Anda .NET Standard.

Jon Skeet
sumber
5
@ ÁlvaroGarcía: Apa yang Anda maksud dengan "itu" harus kompatibel? .NET Core 1.0? Belum tentu - karena .NET Core 1.0 masih dapat memasukkan hal - hal tambahan . Entri itu berarti bahwa jika Anda menargetkan .NET Standar 1.6, Anda dapat menjalankan kode di bawah Mono 4.6 dan .NET Core 1.0.
Jon Skeet
4
Anda tidak dapat menjalankan perakitan .NET Core pada apa pun selain .NET Core (CoreCLR & CoreFX). Anda dapat menjalankan perakitan .NET Standard pada kerangka apa pun yang memenuhi kewajiban kontraktual untuk Standar yang relevan (1.3, 1.6, 2.0, dll).
Mark Rendle
2
Cross-platform mengacu pada sistem operasi, bukan kerangka kerja.
Mark Rendle
15
Sebagai analogi, coba bayangkan .NET Standard sebagai Antarmuka (misalnya INetStandard16). .NET Core 1.0 dan Mono 4.6 keduanya mengimplementasikan INetStandard16. Anda tidak dapat mengonversi .Net Core 1.0 ke Mono 4.6 (dan sebaliknya), tetapi apa pun yang menggunakan INetStandard16akan bekerja pada keduanya. (kredit untuk David Fowler )
Federico Dipuma
6
Ini mengejutkan saya. Nama-nama itu kelihatannya terbalik. Anda akan berpikir sesuatu yang bernama "inti" akan menjadi lebih minimal dari keduanya ...
jpmc26
6

Pustaka .NET Core Class pada dasarnya adalah bagian dari pustaka .NET Framework, yang hanya mengandung lebih sedikit API. Menempel ke perpustakaan .NET Core Class membuatnya sulit untuk berbagi kode antara runtimes. Kode ini mungkin tidak berfungsi untuk runtime yang berbeda (Mono untuk Xamarin), karena tidak memiliki API yang Anda butuhkan. Untuk mengatasinya ada .NET Standard, yang hanya kumpulan spesifikasi yang memberi tahu Anda API mana yang dapat Anda gunakan . Tujuan utama .NET Standard adalah untuk membagikan kode antar runtime. Dan penting bahwa spesifikasi ini diterapkan oleh semua runtime. (.NET Framework, .NET Core dan Mono untuk Xamarin).

Jadi jika Anda yakin bahwa Anda akan menggunakan pustaka Anda hanya untuk proyek .NET Core, Anda dapat mengabaikan .NET Standard, tetapi jika bahkan ada kemungkinan kecil bahwa kode Anda akan digunakan oleh .NET Framework atau Mono untuk Xamarin maka lebih baik untuk tetap berpegang pada .NET Standard

Juga perhatikan bahwa versi yang lebih tinggi .NET Standard mengandung lebih banyak API, tetapi versi yang lebih rendah didukung oleh lebih banyak platform. Karenanya, jika Anda membuat pustaka .NET Standard yang ingin Anda bagikan di antara runtimes, maka targetkan versi terendah yang Anda bisa , yang membantu Anda mencapai sebagian besar platform. Misalnya, jika Anda ingin menjalankan pada .NET Framework 4.5 dan .NET Core 1.0, versi .NET Standard tertinggi yang dapat Anda gunakan adalah .NET Standard 1.1. Lihat tabel hebat ini dari dokumentasi untuk informasi lebih lanjut tentangnya.

PS: Juga jika Anda ingin mengonversi perpustakaan Anda ke .NET Standard, .NET Portability Analyzer dapat membantu Anda dengan itu.

pengguna2771704
sumber
5

.NET Standard adalah spesifikasi .NET API yang dimaksudkan tersedia pada implementasi .NET. Ini memungkinkan untuk mendefinisikan kumpulan BCL API yang seragam untuk semua implementasi .NET.

.NET Core adalah salah satu implementasi dari .NET Standard. .NET Framework adalah implementasi lain dari .NET Standard.

Gambar dari .NET Blog

masukkan deskripsi gambar di sini

Jawaban Federicos memberi Anda gambaran grafis tentang bagaimana setiap kerangka kerja berevolusi dengan versi. Lihatlah diagram di bawah ini dari Microsoft Docs .

masukkan deskripsi gambar di sini

Penargetan .NET Standard meningkatkan dukungan platform Anda sementara menargetkan platform .NET tertentu seperti .NET Core (atau .NET Framework) akan memungkinkan Anda untuk menggunakan semua fitur platform untuk platform itu.

Nipuna
sumber
2

.NET Standard adalah spesifikasi API yang harus disediakan oleh semua implementasi .NET. Ini membawa konsistensi pada keluarga .NET dan memungkinkan Anda untuk membangun perpustakaan yang dapat Anda gunakan dari implementasi .NET apa pun. Ini menggantikan PCL untuk membangun komponen bersama.

.NET Core adalah implementasi dari .NET Standard yang dioptimalkan untuk membangun aplikasi konsol, aplikasi Web, dan layanan cloud menggunakan ASP.NET Core. SDK-nya dilengkapi dengan perkakas yang kuat yang selain pengembangan Visual Studio mendukung alur kerja pengembangan berbasis baris perintah penuh. Anda dapat mempelajari lebih lanjut tentang mereka di aka.ms/netstandardfaq dan aka.ms/netcore .


Di atas, bersama dengan penjelasan yang sangat jelas tentang sebagian besar hal yang dibahas dalam pertanyaan ini dapat ditemukan di artikel yang sangat membantu berikut oleh Microsoft (MSDN - September 2017): .NET Standard - Demystifying .NET Core dan .NET Standard

steliosalex
sumber
0

Apakah maksud Anda .NET Framework? Karena standar .NET adalah implementasi, seperti .NET Framework, .NET Core dan Xamarin.

Saya suka .NET Core karena kami dapat meng-host-nya di Linux (gunakan nginx dalam pengalaman saya). Ini berbeda dari .NET framework yang mana Anda hanya dapat meng-host di IIS. Anda dapat mempertimbangkan tentang anggaran hosting dalam hal ini (Karena windows server mahal bagi saya).

Dalam perspektif lingkungan pengembangan , inti .Net adalah ringan. Jadi, Anda dapat menggunakan VSCode, Sublime, untuk IDE (tidak hanya visual studio).

Fityan Aula
sumber
0

Secara sederhana, standar .NET digunakan untuk menulis proyek perpustakaan kelas yang mengkompilasi ke dll. .NET Core dapat digunakan untuk mengembangkan aplikasi web aktual yang dapat berjalan di semua sistem operasi (Windows, Linux, MacOS). (Dalam. NET Core 3 Microsoft telah menyediakan fungsionalitas untuk mengembangkan aplikasi desktop menggunakan WPF, tetapi selama ini aplikasi ini tidak akan lintas platform dan hanya akan berjalan di sistem windows. Di masa depan Microsoft mungkin akan membuatnya juga lintas platform). Standar NET pustaka / dll dapat digunakan dalam aplikasi apa pun yang menggunakan .NET (.NET framework, .NET Core) yang berarti bahwa Anda dapat menggunakan standar .NET dengan kedua .NET framework dan .NET core.

Waleed Naveed
sumber