Di Visual Studio, setidaknya ada 3 jenis perpustakaan kelas yang dapat Anda buat:
- Perpustakaan Kelas (.NET Framework)
- Perpustakaan Kelas (.NET Standard)
- Perpustakaan Kelas (.NET Core)
Sementara yang pertama adalah apa yang telah kami gunakan selama bertahun-tahun, titik utama kebingungan yang saya alami adalah kapan harus menggunakan jenis pustaka kelas .NET Standard dan .NET Core. Saya digigit oleh ini baru-baru ini ketika mencoba untuk multi-target versi kerangka kerja yang berbeda , dan membuat proyek uji unit .
Jadi, apa perbedaan antara Class Library (.NET Standard) dan Class Library (.NET Core) , mengapa keduanya ada, dan kapan kita harus menggunakan satu di atas yang lain?
Jawaban:
Keputusan tersebut merupakan trade-off antara kompatibilitas dan akses API.
Gunakan pustaka .NET Standard ketika Anda ingin meningkatkan jumlah aplikasi yang akan kompatibel dengan pustaka Anda, dan Anda setuju dengan penurunan area permukaan .NET API yang dapat diakses oleh perpustakaan Anda.
Gunakan pustaka .NET Core saat Anda ingin menambah area permukaan .NET API yang dapat diakses pustaka Anda, dan Anda boleh saja dengan hanya mengizinkan .NET Core apps agar kompatibel dengan pustaka Anda.
Misalnya, perpustakaan yang menargetkan .NET Standard 1.3 akan kompatibel dengan aplikasi yang menargetkan .NET Framework 4.6, .NET Core 1.0, Universal Windows Platform 10.0, dan semua platform lain yang mendukung .NET Standard 1.3. Pustaka tidak akan memiliki akses ke beberapa bagian dari .NET API. Misalnya,
Microsoft.NETCore.CoreCLR
paket tersebut kompatibel dengan .NET Core tetapi tidak dengan .NET Standard.Bagian kerangka kerja berbasis paket menjelaskan perbedaannya.
Kompatibilitas: Perpustakaan yang menargetkan .NET Standard akan berjalan pada runtime yang memenuhi standar .NET, seperti .NET Core, .NET Framework, Mono / Xamarin. Di sisi lain, pustaka yang menargetkan .NET Core hanya dapat berjalan di .NET Core runtime.
Area Permukaan API: .NET Standard libraries datang dengan segalanya
NETStandard.Library
sedangkan .NET Core libraries datang dengan semuanyaMicrosoft.NETCore.App
. Yang terakhir mencakup sekitar 20 pustaka tambahan, beberapa di antaranya dapat kita tambahkan secara manual ke pustaka .NET Standard kami (sepertiSystem.Threading.Thread
) dan beberapa di antaranya tidak kompatibel dengan .NET Standard (sepertiMicrosoft.NETCore.CoreCLR
).Juga, perpustakaan .NET Core menentukan runtime dan datang dengan model aplikasi. Itu penting, misalnya, untuk membuat perpustakaan kelas test unit dapat dijalankan.
Mengabaikan perpustakaan untuk sesaat, alasan .NET Standard ada untuk portabilitas; itu mendefinisikan satu set API yang platform NET setuju untuk menerapkan. Platform apa pun yang mengimplementasikan .NET Standard kompatibel dengan pustaka yang menargetkan .NET Standard itu. Salah satu platform yang kompatibel adalah .NET Core.
Kembali ke pustaka, templat pustaka .NET Standard ada untuk dijalankan pada beberapa runtimes (dengan mengorbankan area permukaan API). Terlebih lagi, templat .NET Core library ada untuk mengakses lebih banyak area permukaan API (dengan mengorbankan kompatibilitas) dan untuk menentukan platform yang akan digunakan untuk membuat executable.
Berikut adalah matriks interaktif yang menunjukkan .NET Standard yang mendukung .NET implementasi dan seberapa banyak area permukaan API yang tersedia.
sumber
Sebuah NET Inti Kelas Perpustakaan dibangun di atas Standar NET . Jika Anda ingin mengimplementasikan perpustakaan yang portabel ke .NET Framework ,. .NET Core dan Xamarin , pilih .NET Standard Library
.NET Core pada akhirnya akan mengimplementasikan .NET Standard 2 (seperti halnya Xamarin dan .NET Framework )
NET Inti , Xamarin dan .NET Framework bisa, karena itu, diidentifikasi sebagai rasa dari NET Standard
Untuk bukti di masa depan aplikasi Anda untuk berbagi dan menggunakan kembali kode, Anda lebih suka menerapkan perpustakaan .NET Standard.
Microsoft juga merekomendasikan agar Anda menggunakan .NET Standard alih-alih Portable Class Libraries .
Mengutip MSDN sebagai sumber otoritatif, .NET Standard dimaksudkan sebagai One Library to Rule Them All . Karena gambar bernilai ribuan kata, hal-hal berikut akan memperjelas:
1. Skenario aplikasi Anda saat ini (terfragmentasi)
Seperti kebanyakan dari kita, Anda mungkin berada dalam situasi di bawah ini: (.NET Framework, Xamarin, dan sekarang. Aplikasi NET Core.)
2. Apa yang akan diaktifkan oleh .NET Standard Library untuk Anda (kompatibilitas lintas-kerangka)
Menerapkan .NET Standard Library memungkinkan pembagian kode di semua rasa yang berbeda ini:
Untuk yang tidak sabar:
Agar tabel dapat membantu memahami versi tertinggi dari .NET Standard yang dapat Anda targetkan, berdasarkan platform NET mana yang ingin Anda jalankan, tuju di sini .
Sumber: MSDN: Memperkenalkan .NET Standard
sumber
Jadi jawaban singkatnya adalah:
sumber
.NET dan .NET Core adalah dua implementasi berbeda dari .NET runtime. Baik Core dan Framework (tetapi terutama Framework) memiliki profil yang berbeda yang mencakup pilihan yang lebih besar atau lebih kecil (atau hanya berbeda) dari banyak API dan rakitan yang telah dibuat Microsoft untuk .NET, tergantung di mana mereka diinstal dan dalam profil apa.
Misalnya, ada beberapa API berbeda yang tersedia di aplikasi Universal Windows daripada di profil Windows "normal". Bahkan di Windows, Anda mungkin memiliki profil "Klien" vs. profil "Penuh". Selain itu, dan ada implementasi lain (seperti Mono ) yang memiliki set perpustakaan mereka sendiri.
.NET Standard adalah spesifikasi yang set pustaka dan rakitan API harus tersedia. Aplikasi yang ditulis untuk .NET Standard 1.0 harus dapat dikompilasi dan dijalankan dengan versi Kerangka, Core, Mono, dll., Yang mengiklankan dukungan untuk koleksi .NET Standard 1.0 perpustakaan. Serupa juga berlaku untuk .NET Standard 1.1, 1.5, 1.6, 2.0, dll. Selama runtime memberikan dukungan untuk versi Standar yang ditargetkan oleh program Anda, program Anda harus dijalankan di sana.
Proyek yang ditargetkan pada versi Standar tidak akan dapat menggunakan fitur yang tidak termasuk dalam revisi standar tersebut. Ini tidak berarti Anda tidak dapat mengambil ketergantungan pada majelis lain, atau API yang diterbitkan oleh vendor lain (yaitu: item di NuGet). Tetapi itu berarti bahwa setiap dependensi yang Anda ambil juga harus menyertakan dukungan untuk versi .NET Standard Anda. .NET Standard berkembang dengan cepat, tetapi masih cukup baru, dan cukup peduli tentang beberapa profil runtime yang lebih kecil, sehingga batasan ini dapat terasa menyesakkan. (Catat satu setengah tahun kemudian: ini mulai berubah, dan versi .NET Standard baru-baru ini jauh lebih bagus dan lebih lengkap).
Di sisi lain, aplikasi yang ditargetkan pada Standar harus dapat digunakan dalam lebih banyak situasi penyebaran, karena secara teori dapat dijalankan dengan Core, Framework, Mono, dll. Untuk proyek perpustakaan kelas mencari distribusi yang luas, itu janji yang menarik . Untuk proyek perpustakaan kelas yang digunakan terutama untuk keperluan internal, mungkin tidak terlalu memprihatinkan.
.NET Standard juga dapat berguna dalam situasi di mana tim administrator sistem ingin pindah dari ASP.NET pada Windows ke ASP.NET untuk .NET Core di Linux untuk alasan filosofis atau biaya, tetapi tim Pengembangan ingin terus bekerja melawannya. NET Framework dalam Visual Studio pada Windows.
sumber
.NET Framework dan .NET Core keduanya merupakan framework.
.NET Standard adalah standar (dengan kata lain, spesifikasi).
Anda dapat membuat proyek yang dapat dieksekusi (seperti aplikasi konsol, atau aplikasi ASP.NET) dengan .NET Framework dan .NET Core, tetapi tidak dengan .NET Standard.
Dengan .NET Standard, Anda hanya dapat membuat proyek perpustakaan kelas yang tidak dapat dieksekusi mandiri dan harus dirujuk oleh proyek .NET Core atau .NET Framework yang dapat dieksekusi.
sumber
Semoga ini akan membantu untuk memahami hubungan antara permukaan .NET Standard API dan platform .NET lainnya . Setiap antarmuka mewakili kerangka kerja target dan metode mewakili kelompok-kelompok API yang tersedia pada kerangka kerja target itu.
Sumber
sumber
Cara lain untuk menjelaskan perbedaan bisa dengan contoh dunia nyata, karena kebanyakan dari kita manusia akan menggunakan alat dan kerangka kerja yang ada (Xamarin, Unity, dll) untuk melakukan pekerjaan itu.
Jadi, dengan .NET Framework Anda memiliki semua alat .NET untuk digunakan, tetapi Anda hanya dapat menargetkan aplikasi Windows (UWP, Winforms, ASP.NET, dll). Karena .NET Framework adalah sumber tertutup, tidak banyak yang dapat dilakukan tentangnya.
Dengan .NET Core Anda memiliki lebih sedikit alat tetapi Anda dapat menargetkan Platform Desktop utama (Windows, Linux, Mac). Ini sangat berguna dalam aplikasi ASP.NET Core, karena Anda sekarang dapat meng-host Asp.net di Linux (harga hosting lebih murah). Sekarang, karena .NET Core bersumber terbuka, secara teknis dimungkinkan untuk mengembangkan perpustakaan untuk platform lain. Tetapi karena tidak ada kerangka kerja yang mendukungnya, saya tidak berpikir itu ide yang bagus.
Dengan .NET Standard Anda memiliki alat yang lebih sedikit tetapi Anda dapat menargetkan semua / sebagian besar platform. Anda dapat menargetkan Seluler berkat Xamarin, dan Anda bahkan dapat menargetkan Konsol Game berkat Mono / Unity. Pembaruan: Mungkin juga untuk menargetkan klien web dengan platform UNO dan Blazor (meskipun keduanya agak eksperimental sekarang).
Dalam aplikasi dunia nyata Anda mungkin perlu menggunakan semuanya. Sebagai contoh, saya mengembangkan aplikasi point of sale yang memiliki arsitektur berikut:
Dibagikan Server dan Klien:
Karena ini adalah perpustakaan .NET Standard, ini dapat digunakan dalam proyek lain (klien dan server).
Juga keuntungan bagus memiliki validasi pada pustaka .NET standard karena saya dapat memastikan validasi yang sama diterapkan pada server dan klien. Server wajib, sementara klien opsional dan berguna untuk mengurangi lalu lintas.
Sisi Server (API Web):
Pustaka .NET Standard (bisa juga Core) yang menangani semua koneksi basis data.
Proyek .NET Core yang menangani Rest API dan memanfaatkan pustaka basis data.
Karena ini dikembangkan dalam .NET Core, saya dapat meng-host aplikasi pada server Linux.
Sisi Klien (MVVM dengan WPF + Xamarin. Bentuk Android / iOS):
Pustaka .NET Standard yang menangani koneksi API klien.
Pustaka .NET Standard yang menangani Logika ViewModels. Digunakan di semua tampilan.
Aplikasi .NET Framework WPF yang menangani tampilan WPF untuk aplikasi windows. Pembaruan: Aplikasi WPF dapat menjadi .NET core sekarang, meskipun saat ini hanya berfungsi di windows. AvaloniaUI adalah alternatif yang baik untuk membuat aplikasi Desktop GUI untuk platform desktop lainnya.
Pustaka .NET Standard yang menangani tampilan Formulir Xamarin.
Proyek Xamarin Android dan Xamarin IOS.
Jadi Anda dapat melihat bahwa ada keuntungan besar di sini di sisi klien dari aplikasi, karena saya dapat menggunakan kembali keduanya .NET Standard libraries (Client API dan ViewModels) dan hanya membuat tampilan tanpa logika untuk aplikasi WPF, Xamarin dan iOS.
sumber
.NET Standard: Anggap saja sebagai perpustakaan standar besar. Saat menggunakan ini sebagai dependensi Anda hanya bisa membuat libraries (.DLLs), bukan executable. Pustaka yang dibuat dengan standar .NET sebagai ketergantungan dapat ditambahkan ke Xamarin. Android, sebuah Xamarin.iOS, proyek .NET Core Windows / OS X / Linux.
.NET Core: Anggap saja sebagai kelanjutan dari kerangka .NET yang lama, hanya saja itu opensource dan beberapa hal belum diimplementasikan dan yang lainnya sudah tidak digunakan lagi. Ini memperluas standar .NET dengan fungsi tambahan, tetapi hanya berjalan di desktop . Saat menambahkan ini sebagai dependensi, Anda dapat membuat aplikasi yang dapat dijalankan pada Windows, Linux dan OS X. (Meskipun konsol hanya untuk saat ini, tidak ada GUI). Jadi. NET Core = .NET Standard + desktop spesifik.
Juga UWP menggunakannya dan ASP.NET Core baru menggunakannya sebagai ketergantungan juga.
sumber
.NET Standard ada terutama untuk meningkatkan berbagi kode dan membuat API tersedia di setiap implementasi .NET lebih konsisten.
Saat membuat pustaka, kita dapat memiliki target sebagai .NET Standard 2.0 sehingga pustaka yang dibuat akan kompatibel dengan berbagai versi .NET Framework termasuk .NET Core, Mono , dll.
sumber
Di atas jawaban mungkin menggambarkan pemahaman terbaik tentang perbedaan antara inti bersih, standar bersih dan bingkai bersih jadi saya hanya ingin berbagi pengalaman saya ketika memilih ini lebih dari itu.
Dalam proyek yang Anda butuhkan untuk mencampur antara .NET Framework, .NET Core dan .NET Standard. Sebagai contoh, pada saat kita membangun sistem dengan .NET Core 1.0, tidak ada dukungan untuk hosting Layanan Windows dengan .net core.
Alasan berikutnya adalah kami menggunakan Laporan Aktif yang tidak mendukung .NET Core. Jadi kami ingin membangun pustaka infrastruktur yang dapat digunakan untuk .NET Core (asp.net core) dan Windows Service and Reporting (.NET Framework) -> Itulah mengapa kami memilih .NET Standard untuk jenis perpustakaan ini. Memilih .NET standar berarti Anda harus mempertimbangkan dengan cermat setiap kelas di perpustakaan harus sederhana dan lintas .NET (inti, kerangka kerja, standar).
Kesimpulan:
Microsoft baru saja mengumumkan .NET 5: https://devblogs.microsoft.com/dotnet/introducing-net-5/
sumber
NET Framework. Aplikasi Windows Form, ASP.NET dan WPF harus dikembangkan menggunakan .NET Framework library
Aplikasi .NET Standard Xamarin, IOs dan MAC OSx harus di-devop menggunakan .NET Standard library
.NET Core
Universal Windows Platform (UWP) dan aplikasi Linux harus dikembangkan menggunakan .NET Core library. API diimplementasikan dalam C ++ dan Anda dapat menggunakan C ++, VB.NET, C #, F # dan Javascript languages.NET
sumber
.Net Core Class Library dibangun di atas standar .Net. Jika Anda ingin menerapkan perpustakaan yang portabel ke .Net Framework, .Net Core dan Xamarin, pilih .Net Standard Library
sumber