.NET Standard

.NET Standard, birden çok .NET uygulamasında kullanılabilen .NET API'lerinin resmi bir belirtimidir. .NET Standard'ın arkasındaki motivasyon, .NET ekosisteminde daha fazla tekdüzen oluşturmaktı. .NET 5 ve sonraki sürümleri, çoğu senaryoda .NET Standard gereksinimini ortadan kaldıran tekdüzenlik oluşturmak için farklı bir yaklaşım benimser. Ancak, .NET Framework ile .NET Core gibi başka bir .NET uygulaması arasında kod paylaşmak istiyorsanız kitaplığınız .NET Standard 2.0'ı hedeflemelidir. .NET Standard'ın yeni sürümleri yayımlanmaz, ancak .NET 5, .NET 6 ve sonraki tüm sürümler .NET Standard 2.1 ve önceki sürümleri desteklemeye devam edecektir.

.NET 5+ ile .NET Standard arasında seçim yapma hakkında bilgi için bu makalenin devamında yer alan .NET 5+ ve .NET Standard'a bakın.

.NET Standard sürümleri

.NET Standard sürümü oluşturulur. Her yeni sürüm daha fazla API ekler. Bir kitaplık belirli bir .NET Standard sürümüne göre oluşturulduğunda, bu .NET Standard (veya üzeri) sürümünü uygulayan herhangi bir .NET uygulamasında çalıştırılabilir.

.NET Standard'ın daha yüksek bir sürümünü hedeflemek, kitaplığın daha fazla API kullanmasına olanak tanır, ancak yalnızca .NET'in daha yeni sürümlerinde kullanılabileceğini gösterir. Daha düşük bir sürümü hedeflemek kullanılabilir API'leri azaltır, ancak kitaplığın daha fazla yerde çalışabileceği anlamına gelir.

.NET Standard sürümünü seçin

.NET Standard 1.0, kullanılabilir 37.118 API'nin 7.949'una sahiptir.

.NET uygulaması Sürüm desteği
.NET ve .NET Core 1.0, 1.1, 2.0, 2.1, 2.2, 3.0, 3.1, 5.0, 6.0, 7.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
Evrensel Windows Platformu 8.0, 8.1, 10.0, 10.0.16299, TBD
Unity 2018.1

Daha fazla bilgi için bkz. .NET Standard 1.0. Etkileşimli bir tablo için bkz. .NET Standard sürümleri.

Hedeflenen .NET Standart sürümü

Önceki bir sürümü desteklemeniz gerekmediği sürece .NET Standard 2.0'ı hedeflemenizi öneririz. Genel amaçlı kitaplıkların çoğu .NET Standard 2.0 dışında API'lere ihtiyaç duymamalıdır. .NET Standard 2.0 tüm modern platformlar tarafından desteklenir ve tek bir hedefle birden çok platformu desteklemenin önerilen yoludur.

.NET Standard 1.x'i desteklemeniz gerekiyorsa.NET Standard 2.0'ı da hedeflemenizi öneririz. .NET Standard 1.x, büyük bir paket bağımlılık grafiği oluşturan ve geliştiricilerin derleme sırasında çok sayıda paketi indirmesine neden olan ayrıntılı bir NuGet paketleri kümesi olarak dağıtılır. Daha fazla bilgi için bu makalenin devamında platformlar arası hedefleme ve .NET 5+ ve .NET Standard konularını inceleyin.

.NET Standard sürüm oluşturma kuralları

İki birincil sürüm oluşturma kuralı vardır:

  • Eklenebilir: .NET Standart sürümleri mantıksal olarak eşmerkezli dairelerdir: daha yüksek sürümler önceki sürümlerdeki tüm API'leri içerir. Sürümler arasında hataya neden olan bir değişiklik yoktur.
  • Sabit: Gönderildikten sonra .NET Standard sürümleri dondurulur.

2.1 sürümünden sonra yeni .NET Standard sürümü olmayacaktır. Daha fazla bilgi için bu makalenin devamında yer alan .NET 5+ ve .NET Standard'a bakın.

Belirtim

.NET Standard belirtimi, standartlaştırılmış bir API kümesidir. Belirtim özellikle Microsoft (.NET Framework, .NET Core ve Mono içerir) ve Unity gibi .NET uygulayıcıları tarafından korunur.

Resmi yapıtlar

Resmi belirtim, standardın parçası olan API'leri tanımlayan bir .cs dosyaları kümesidir. Dotnet/standard deposundaki (şimdi arşivlenmiş) ref dizini .NET Standard API'lerini tanımlar.

NETStandard.Library meta paketi (kaynak), bir veya daha fazla .NET Standard sürümünü tanımlayan (kısmen) kitaplık kümesini açıklar.

gibi System.Runtimebelirli bir bileşen şunları açıklar:

  • .NET Standard'ın bir parçası (yalnızca kapsamı).
  • Bu kapsam için .NET Standard'ın birden çok sürümü.

Türev yapıtlar, daha kolay okumayı ve belirli geliştirici senaryolarını (örneğin, derleyici kullanarak) etkinleştirmek için sağlanır.

Paket gösterimi

.NET Standart referans derlemeleri için birincil dağıtım aracı NuGet paketleridir. Uygulamalar, her .NET uygulaması için uygun olan çeşitli yollarla sunulur.

NuGet paketleri bir veya daha fazla çerçeveyi hedefler. .NET Standard paketleri ".NET Standard" çerçevesini hedefler. Sıkıştırılmış TFM'yi (örneğin, netstandard1.4) kullanarak .NET Standard çerçevesini netstandard hedefleyebilirsiniz. .NET'in birden çok uygulamasında çalışması amaçlanan kitaplıklar bu çerçeveyi hedeflemelidir. En geniş API kümesi için kullanılabilir API sayısı .NET Standard 1.6 ile 2.0 arasında ikiden fazla olduğundan hedef netstandard2.0 alın.

NETStandard.Library Meta paket, .NET Standard'ı tanımlayan nuget paketlerinin tamamına başvurur. Hedeflemenin netstandard en yaygın yolu bu meta pakete başvurmaktır. ~40 .NET kitaplıklarını ve .NET Standard'ı tanımlayan ilişkili API'leri açıklar ve erişim sağlar. Ek API'lere erişim elde etmek için hedef netstandard alan ek paketlere başvurabilirsiniz.

Sürüm Oluşturma

Belirtim tekil değil, doğrusal olarak sürümlenmiş bir API kümesidir. Standardın ilk sürümü bir temel API kümesi oluşturur. Sonraki sürümler API'leri ekler ve önceki sürümler tarafından tanımlanan API'leri devralır. API'leri Standart'tan kaldırmak için belirlenmiş bir sağlama yoktur.

.NET Standard herhangi bir .NET uygulamasına özgü değildir ve bu uygulamalardan herhangi birinin sürüm oluşturma düzeniyle eşleşmez.

Daha önce belirtildiği gibi, 2.1'in ardından yeni .NET Standard sürümleri olmayacaktır.

Hedef .NET Standard

Çerçevenin ve NETStandard.Library meta paketin bir bileşimini netstandard kullanarak .NET Standart Kitaplıkları oluşturabilirsiniz.

uyumluluk modunu .NET Framework

.NET Standard 2.0'dan itibaren .NET Framework uyumluluk modu kullanıma sunulmuştur. Bu uyumluluk modu, .NET Standard projelerinin .NET Standard için derlenmiş gibi .NET Framework kitaplıklara başvurmasını sağlar. .NET Framework kitaplıklarına başvurmak, Windows Presentation Foundation (WPF) API'leri kullanan kitaplıklar gibi tüm projelerde çalışmaz.

Daha fazla bilgi için bkz. .NET Framework uyumluluk modu.

.NET Standard kitaplıkları ve Visual Studio

Visual Studio'da .NET Standard kitaplıkları oluşturmak için, Windows'da Visual Studio 2022, Visual Studio 2019 veya Visual Studio 2017 sürüm 15.3 veya sonraki bir sürümün ya da macOS'ta Mac için Visual Studio sürüm 7.1 veya üzerinin yüklü olduğundan emin olun.

Projelerinizde yalnızca .NET Standard 2.0 kitaplıklarını kullanmanız gerekiyorsa, bunu Visual Studio 2015'te de yapabilirsiniz. Ancak NuGet istemcisi 3.6 veya üzeri yüklü olmalıdır. Visual Studio 2015 için NuGet istemcisini NuGet indirmeleri sayfasından indirebilirsiniz.

.NET 5+ ve .NET Standard

.NET 5 ve .NET 6, Windows masaüstü uygulamaları ve platformlar arası konsol uygulamaları, bulut hizmetleri ve web siteleri için kullanılabilen tekdüzen bir özellik ve API kümesine sahip tek ürünlerdir. Örneğin .NET 5 TFM'leri bu çok çeşitli senaryoları yansıtır:

  • net5.0

    Bu TFM, her yerde çalışan kodlara yöneliktir. Birkaç istisna dışında, yalnızca platformlar arası çalışan teknolojileri içerir. .NET 5 kodu için hem net5.0 hem de netcoreappnetstandard TFM'lerin yerini alır.

  • net5.0-windows

    Bu, başvuruda bulunan her şeye net5.0 işletim sistemine özgü işlevsellik ekleyen işletim sistemine özgü bir TFM örneğidir.

Net5.0 veya net6.0 ile netstandard karşılaştırması ne zaman hedeflendiğinde

'yi hedefleyen mevcut kod için netstandardTFM'yi veya net6.0olarak net5.0 değiştirmeniz gerekmez. .NET 5 ve .NET 6, .NET Standard 2.1 ve önceki sürümleri uygular. .NET Standard'dan .NET 5+ sürümüne yeniden hedeflemenin tek nedeni daha fazla çalışma zamanı özelliğine, dil özelliğine veya API'ye erişim kazanmaktır. Örneğin, C# 9 kullanmak için .NET 5 veya sonraki bir sürümü hedeflemeniz gerekir. Daha yeni özelliklere erişmek için .NET 5 veya .NET 6 ve .NET Standard'ı birden çok hedefleyebilir ve kitaplığınızı diğer .NET uygulamalarında kullanmaya devam edebilirsiniz.

.NET 5+ için yeni koda yönelik bazı yönergeler şunlardır:

  • Uygulama bileşenleri

    Bir uygulamayı birkaç bileşene bölmek için kitaplıklar kullanıyorsanız, veya net6.0öğesini hedeflemenizi net5.0 öneririz. Kolaylık olması için, uygulamanızı oluşturan tüm projeleri aynı .NET sürümünde tutmak en iyisidir. Ardından her yerde aynı BCL özelliklerini varsayabilirsiniz.

  • Yeniden kullanılabilir kitaplıklar

    NuGet'te göndermeyi planladığınız yeniden kullanılabilir kitaplıklar oluşturuyorsanız erişim ve kullanılabilir özellik kümesi arasındaki dengeyi göz önünde bulundurun. .NET Standard 2.0, .NET Framework tarafından desteklenen en son sürümdür, bu nedenle oldukça büyük bir özellik kümesiyle iyi erişim sağlar. .NET Standard 1.x'i hedeflemenizi önermiyoruz çünkü erişimde en az artış için kullanılabilir özellik kümesini sınırlandırabilirsiniz.

    .NET Framework desteklemeniz gerekmiyorsa .NET Standard 2.1 veya .NET 5/6 ile gidebilirsiniz. .NET Standard 2.1'i atlayıp doğrudan .NET 6'ya geçmenizi öneririz. En yaygın kullanılan kitaplıklar hem .NET Standard 2.0 hem de .NET 5+ için çoklu hedef oluşturur. .NET Standard 2.0'ın desteklenmesi size en fazla erişimi sağlarken.NET 5+ desteği ise zaten .NET 5+ üzerinde olan müşteriler için en son platform özelliklerinden yararlanabilmenizi sağlar.

.NET Standard sorunları

.NET 5 ve sonraki sürümlerin platformlar ve iş yükleri arasında kod paylaşmanın neden daha iyi bir yolu olduğunu açıklamaya yardımcı olan .NET Standard ile ilgili bazı sorunlar şunlardır:

  • Yeni API'ler ekleme yavaşlığı

    .NET Standard, tüm .NET uygulamalarının desteklemesi gereken bir API kümesi olarak oluşturulduğu için yeni API'ler ekleme önerileri için bir gözden geçirme işlemi yapıldı. Amaç, yalnızca mevcut ve gelecekteki tüm .NET platformlarında uygulanabilecek API'leri standart hale getirmekti. Sonuç olarak, bir özellik belirli bir sürümü kaçırdıysa, Standart sürümüne eklenmeden önce birkaç yıl beklemeniz gerekebilir. Ardından .NET Standard'ın yeni sürümünün yaygın olarak desteklenmesi için daha da uzun süre beklersiniz.

    .NET 5+ çözümü: Bir özellik uygulandığında, kod tabanı paylaşıldığından her .NET 5+ uygulaması ve kitaplığı için zaten kullanılabilir. API belirtimi ile uygulaması arasında bir fark olmadığından yeni özelliklerden .NET Standard'dan çok daha hızlı yararlanabilirsiniz.

  • Karmaşık sürüm oluşturma

    API belirtiminin uygulamalarından ayrılması, API belirtimi sürümleriyle uygulama sürümleri arasında karmaşık eşlemeyle sonuç alır. Bu karmaşıklık, bu makalenin önceki bölümlerinde gösterilen tabloda ve bunu yorumlama yönergelerinde açıktır.

    .NET 5+ çözümü: .NET 5+ API belirtimi ile uygulaması arasında ayrım yoktur. Sonuç, basitleştirilmiş bir TFM şemasıdır. Tüm iş yükleri için bir TFM ön eki vardır: net5.0 veya net6.0 kitaplıklar, konsol uygulamaları ve web uygulamaları için kullanılır. Tek varyasyon, veya net6.0-windowsgibi net5.0-windows belirli bir platform için platforma özgü API'leri belirten bir sonektir. Bu TFM adlandırma kuralı sayesinde, belirli bir uygulamanın belirli bir kitaplığı kullanıp kullanamayacağını kolayca anlayabilirsiniz. .NET Standard için olan gibi sürüm numarası eşdeğerleri tablosu gerekmez.

  • Çalışma zamanında platform tarafından desteklenmeyen özel durumlar

    .NET Standard, platforma özgü API'leri kullanıma sunar. Kodunuz hatasız derlenebilir ve taşınabilir olmasa bile herhangi bir platforma taşınabilir gibi görünebilir. Belirli bir API için uygulaması olmayan bir platformda çalıştığında, çalışma zamanı hataları alırsınız.

    .NET 5+ çözümü: .NET 5+ SDK'ları, varsayılan olarak etkinleştirilen kod çözümleyicileri içerir. Platform uyumluluk çözümleyicisi, üzerinde çalıştırmak istediğiniz platformlarda desteklenmeyen API'lerin yanlışlıkla kullanıldığını algılar. Daha fazla bilgi için bkz. Platform uyumluluğu çözümleyicisi.

.NET Standard kullanım dışı değil

.NET Standard, birden çok .NET uygulaması tarafından kullanılabilecek kitaplıklar için hala gereklidir. Aşağıdaki senaryolarda .NET Standard'i hedeflemenizi öneririz:

  • .NET Framework ve diğer tüm .NET uygulamaları arasında kod paylaşmak için kullanınnetstandard2.0.
  • Mono, Xamarin ve .NET Core 3.x arasında kod paylaşmak için kullanın netstandard2.1 .

Ayrıca bkz.