.NET Standard ve .NET Core karşılaştırması


240

.NET Standard ve .NET Core arasındaki farkı okudum, ancak farkın ne olduğunu veya ne zaman bir .NET Standard kütüphane projesini ve ne zaman bir .NET Core kütüphane projesini seçeceğimi bilmiyorum.

.NET Standard'ın, kullanılan platform ne olursa olsun, bir dizi API'nin her zaman kullanılabilir olmasını sağlamak olduğunu okudum (bu platform, seçtiğim .NET Standard sürümü ile uyumlu olduğu sürece). Yanılmıyorsam, bu, .NET Standard'ın bir sınıf kitaplığını oluşturabildiğim ve daha sonra seçtiğim .NET Standard sürümüyle uyumlu herhangi bir platformda kullanabileceğim anlamına gelir.

.NET Core ile, platformlar arası kullanım için de tasarlandığını okudum, bu yüzden bir .NET Core kütüphanesi seçersem, .NET Standard gibi birçok platformda da kullanabileceğim gibi görünüyor.

Sonunda farkı görmüyorum. Hangisini ne zaman kullanmalıyım? Onların arasındaki fark ne?


33
Kod terimleriyle: .net standardı = arayüz, .net çekirdeği = sınıf; sınıfa karşı kod yazarsanız daha fazla yöntem (vb.) elde edemezsiniz, ancak bu somut türle (ve torunlarla) sınırlandırılırsınız; Eğer arayüzü kullanmak eğer olabilir daha küçük bir yüzey elde, ancak sürece bu uygulamalar ne beklendiğini :) evet, .net çekirdek hedeflerini çok sayıda platformu gibi ... keyfi uygulamalara karşı çalışacaktır ancak orada diğer .net uygulamaları standart
Marc Gravell

9
.NETStandard, PCL'nin yerine geçer. Taşınabilir Sınıf Kitaplığı, birden fazla platformda (telefon, masaüstü, mağaza, tarayıcı, xbox vb.) Çalışabilecek bir kitaplık yazmanıza yardımcı oldu. Çok iyi ölçeklenmedi, n'den kötü acı çekti! sorun, o yüzden terk ettiler. .NETCore sadece yaptıkları ilk çerçeve, en kolayı, geri kalanı yakalamak zorunda. Bunun çok devam eden bir çalışma olduğunu ve .NETStandard v2.0 ile birlikte büyük değişiklikler olduğunu unutmayın. Şimdilik hepsine hükmedecek bir standart :)
Hans Passant

Lütfen mevcut sorulara fazladan soru eklemeyin. Düzenlemedeki sorunuz bundan ayrı.
Jon Skeet

1
@JonSkeet O zaman yeni bir soru açmalıyım? Tavsiye için teşekkürler. çünkü ilk başta .net Core çoklu hedefi hakkında yeni bir sorgu açtım ve bunun yinelenen bir soru olduğunu söyledikleri için indirildim.
Álvaro García

@ ÁlvaroGarcía: Evet, ama açıklığa kavuşturun - şu andaki tek cümlelik sorunuz bana hiç açık değil.
Jon Skeet

Yanıtlar:


195

Şüphelerinizi daha da netleştirmeye ve Jon Skeet'in cevabını genişletmeye çalışacağım.

.NET Standard bir belirtimdir , bu nedenle belirli bir .NET Standard sürümü için derlenen kitaplık farklı .NET Standard uygulamalarında kullanılabilir.

Diğer yorumumda belirtildiği gibi, .NET Standard ve diğer .NET Standart Uygulamaları (.NET Core, .NET Framework, vb.) Arasındaki ilişki için iyi bir benzetme David Fowler'in bu özüdür : InterfacesÇerçeveler bu arayüzlerin uygulamaları.

Bu basitleştirilmiş diyagram bu ilişkiyi anlamaya yardımcı olabilir:

NET Standart Arayüzler benzetmesi

Herhangi bir hedeflemenin API'lara ve belirli API'lara (örneğin ) NetCore10erişimi vardır .INetStandard15 NetCore10 DotNetHostPolicy

Elbette bu kütüphane farklı INetStandard15uygulamalarda kullanılamaz ( veya NetCore10dönüştürülemez ).NetFramework462Mono46

Eğer, bunun yerine, ihtiyaç yalnızca erişim Eğer INetStandard15API'ler Kütüphanenizin tarafından kullanılabilir (ve hedef yerine somut çerçevesinin şartname o) herhangi hangi uygular bunu çerçevesinde ( NetCore10, NetFramework462vs.)

Not: Orijinal benzetmede David Fowler hem .NET Standard sürümleri hem de altyapı uygulamaları için arayüzler kullandı. Arayüzler ve sınıflar kullanmanın daha sezgisel ve daha iyi olduğuna inanıyorum, spesifikasyonlar ve somut uygulamalar arasındaki ilişkiyi temsil ediyor.


2
Bunun için çok teşekkürler. Ama bir şüphem var. .Net standardı bir arabirimse ve örneğin .net framework ve .net Core ile uygulanabilirse, bir .net standart sınıf kitaplığı oluşturduğumda ve bu kitaplığı başka bir projede kullandığımda, hangi uygulamanın kullanıldığını, net framework veya .net Çekirdek?
Álvaro García

8
Derlenmiş uygulamanın uygulanmasını kullanır (ne olursa olsun). Bir NET core uygulamasını
derlerseniz

5
Bu diyagram, çekirdek / standart / çerçeve ilişkisini göstermede harika bir yardımcıdır.
Jasper

Bir net461 konsol uygulaması oluşturup bir netstandard2.0 kütüphanesini hedeflersem, bu standart lib'den hiçbir şey konsol uygulamasında çözülmez. Yani... ??
Sinaesthetic

2
Bir resim bin kelimeye bedeldir
Nikaas

182

.NET Core, .NET Standard'ın bir uygulamasıdır . Birden çok işletim sisteminde kullanılabilir, ancak bu aynı şey değildir - .NET Standard'ın başka uygulamaları da vardır.

Dolayısıyla, bir .NET Core kitaplığı oluşturursanız, .NET Core'da uygulanan, ancak .NET Standard'ın bir parçası olmayan şeylere erişebilecek ve kitaplığınız , .NET Standard'ın diğer uygulamalarıyla uyumlu olmayacak , Xamarin, Tizen, tam .NET masaüstü çerçevesi vb.

Kısacası: maksimum taşınabilirlik elde etmek için kitaplığınızı .NET Standard'ı hedefleyin.


5
@ ÁlvaroGarcía: "Öyle" ile uyumlu olmak ne demek? .NET Core 1.0? Mutlaka değil - çünkü .NET Core 1.0 hala ekstra şeyler içerebilir . .NET Standard 1.6 hedef varsa, Mono 4.6 hem altında kod çalıştırmasına ki bu giriş araçlarının ve .NET Çekirdeği 1.0.
Jon Skeet

4
.NET Core derlemesini .NET Core (CoreCLR ve CoreFX) dışında hiçbir şeyde çalıştıramazsınız. Bir .NET Standard derlemesini, ilgili Standardın (1.3, 1.6, 2.0, vb.) Sözleşme yükümlülüklerini karşılayan herhangi bir çerçevede çalıştırabilirsiniz.
Mark Rendle

2
Çapraz platform, çerçeveyi değil işletim sistemini ifade eder.
Mark Rendle

15
Bir benzetme olarak, .NET Standardını bir Arayüz olarak hayal etmeyi deneyin (örn. INetStandard16). .NET Core 1.0 ve Mono 4.6 her ikisi de uygular INetStandard16. Net Core 1.0'ı Mono 4.6'ya (ve tersi) dönüştüremezsiniz, ancak kullanılan her şey INetStandard16her ikisinde de çalışır. ( David Fowler'a verilen krediler )
Federico Dipuma

6
Bu beni şaşırttı. İsimler geriye doğru görünüyor. "Çekirdek" adlı bir şeyin ikisinden daha az olacağını düşünürdünüz ...
jpmc26

6

.NET Core Sınıf kitaplığı temel olarak yalnızca daha az API içeren bir .NET Framework kitaplığının alt kümesidir. .NET Core Class kütüphanesine bağlı kalmak, çalışma zamanları arasında kod paylaşımını zorlaştırır. Bu kod farklı bir çalışma zamanı (Xamarin için Mono) için çalışmayabilir, çünkü ihtiyacınız olan API'ye sahip değildir. Bunu çözmek için , hangi API'leri kullanabileceğinizi belirten bir dizi spesifikasyon olan .NET Standard vardır . .NET Standard'ın temel amacı, çalışma zamanları arasındaki kodu paylaşmaktır. Ve bu spesifikasyonun tüm çalışma zamanları tarafından uygulanması önemlidir. (.NET Framework, .NET Core ve Xamarin için Mono).

Bu nedenle kitaplığınızı yalnızca .NET Core projeleri için kullanacağınızdan eminseniz, .NET Standard'ı göz ardı edebilirsiniz, ancak kodunuzun .NET Framework veya Xamarin için Mono tarafından kullanılması için küçük bir şans olsa bile daha iyidir .NET Standardına bağlı kalmak

Ayrıca, .NET Standard'ın daha yüksek sürümlerinin daha fazla API içerdiğini, ancak daha düşük sürümlerin daha fazla platform tarafından desteklendiğini unutmayın. Bu nedenle, çalışma zamanları arasında paylaşmak istediğiniz bir .NET Standard kitaplığı oluşturursanız , en çok platforma ulaşmanıza yardımcı olacak en düşük sürümü hedefleyin . Örneğin, .NET Framework 4.5 ve .NET Core 1.0 üzerinde çalıştırmak istiyorsanız, kullanabileceğiniz en yüksek .NET Standard sürümü .NET Standard 1.1'dir. Hakkında daha fazla bilgi için belgelerdeki bu harika tabloya bakın .

Not: Ayrıca kitaplığınızı .NET Standard'a dönüştürmek istiyorsanız, .NET Taşınabilirlik Çözümleyicisi size bu konuda yardımcı olabilir.


4

.NET Standard , .NET uygulamalarında kullanılabilir olması amaçlanan .NET API'lerinin bir özelliğidir. Bu, tüm .NET uygulamaları için tek tip BCL API'lerinin tanımlanmasını sağlar.

.NET Core , .NET Standard'ın böyle bir uygulamasıdır. .NET Framework, .NET Standard'ın başka bir uygulamasıdır.

Image NET Blog

resim açıklamasını buraya girin

Federicos yanıtı , her çerçevenin sürümlerle nasıl geliştiğine ilişkin grafiksel bir genel bakış sunar. Microsoft Docs'tan aşağıdaki şemaya göz atın .

resim açıklamasını buraya girin

Hedefleme .NET Standard böyle NET Çekirdek (veya .NET Framework) gibi belirli bir .NET platformunu hedefleyen oysa, platform desteği söz konusu platform için tüm platform özelliklerini kullanmanızı sağlayacak artırır.


2

.NET Standard , tüm .NET uygulamalarının sağlaması gereken API'lerin bir özelliğidir. .NET ailesine tutarlılık getirir ve herhangi bir .NET uygulamasından kullanabileceğiniz kitaplıklar oluşturmanıza olanak tanır. Paylaşılan bileşenler oluşturmak için PCL'lerin yerini alır.

.NET Core , ASP.NET Core kullanan konsol uygulamaları, Web uygulamaları ve bulut hizmetleri oluşturmak için optimize edilmiş .NET Standardının bir uygulamasıdır. SDK'sı, Visual Studio geliştirmeye ek olarak tam komut satırı tabanlı geliştirme iş akışını destekleyen güçlü bir araçla birlikte gelir. Onlar hakkında daha fazla bilgiyi aka.ms/netstandardfaq ve aka.ms/netcore adresinde öğrenebilirsiniz. .


Yukarıdakiler, bu soruda tartışılan şeylerin çoğunun çok açık bir açıklaması ile birlikte Microsoft'un aşağıdaki son derece yararlı makalesinde bulunabilir (MSDN - Eylül 2017): .NET Standard - .NET Core ve .NET Standard'ı Demystifying


0

Bunu mu demek istediniz: .NET Framework Çünkü .NET standardı .NET Framework, .NET Core ve Xamarin gibi bir uygulamadır.

.NET Core'u seviyorum çünkü Linux'ta barındırabiliriz (deneyimimde nginx kullanın). Yalnızca IIS üzerinde barındırabileceğiniz .NET çerçevesinden farklıdır. Bu durumda bütçe barındırma hakkında düşünebilirsiniz (çünkü Windows sunucusu benim için pahalı).

Gelen geliştirme ortamı perspektifinden , Net çekirdek hafiftir. Yani, IDE için VSCode, Sublime, kullanabilirsiniz (sadece görsel stüdyo değil).


0

Basit bir ifadeyle, .NET standardı, dll'ye derlenen sınıf kütüphanesi projelerini yazmak için kullanılır. .NET Core, tüm işletim sistemlerinde (Windows, Linux, MacOS) çalışabilen gerçek web uygulamaları geliştirmek için kullanılabilir. (.NET Core 3'te Microsoft, WPF kullanarak masaüstü uygulamaları geliştirme işlevini sağlamıştır, ancak şu ana kadar bu uygulamalar çapraz platform olmayacak ve yalnızca Windows sisteminde çalışacaktır. Gelecekte Microsoft bunları çapraz platform haline getirebilir). kütüphaneler / dll'ler, .NET (.NET framework, .NET Core) kullanan herhangi bir uygulamada kullanılabilir. Bu, .NET standardını hem .NET framework hem de .NET core ile kullanabileceğiniz anlamına gelir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.