.NET Standard

.NET Standard, birden çok .NET uygulamasında kullanılabilen .NET API'lerinin resmi bir belirtimidir. .NET Standard'ın ardındaki motivasyon.NET ekosisteminde daha fazla tekdüzelik 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 ve sonraki sürümleri .NET Standard 2.1 ve önceki sürümleri desteklemeye devam eder.

.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 Standart sürümleri

.NET Standard sürümüdür. 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 izin verir, ancak bunun 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'unu içerir.

.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, 8.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 Standart 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ığı grafiği oluşturan ve geliştiricilerin derleme sırasında çok sayıda paket 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 Standart sürüm oluşturma kuralları

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

  • Ekleme: .NET Standart sürümleri mantıksal olarak eşmerkezli dairelerdir: 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 Standart 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 Standart 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 dizi .cs dosyasıdır. dotnet/standard deposundaki (şimdi arşivlenmiş) ref dizini .NET Standart 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 netstandardhedefleyebilirsiniz. .NET'in birden çok uygulamasında çalıştırılması 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.

Meta paketi, NETStandard.Library .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şmeyi hedefleyen netstandard 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'ler ekler ve önceki sürümler tarafından tanımlanan API'leri devralır. API'leri Standarttan 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 sürümünden sonra yeni .NET Standard sürümleri olmayacaktır.

Hedef .NET Standard

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

.NET Framework uyumluluk modu

.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ıklarına başvurmasını sağlar. .NET Framework kitaplıklarına başvurmak, Windows Presentation Foundation (WPF) API'lerini kullanan kitaplıklar gibi tüm projelerde çalışmaz.

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

.NET Standart 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 sonraki bir sürümün 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 üzerinin yüklü olması gerekir. Visual Studio 2015 için NuGet istemcisini NuGet indirmeleri sayfasından indirebilirsiniz.

.NET 5+ ve .NET Standard

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

  • net8.0

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

  • net8.0-windows

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

Net8.0 ile netstandard karşılaştırması ne zaman hedeflendiğinde

'yi hedefleyen mevcut kodlar netstandardiçin TFM'yi veya sonraki bir TFM olarak net8.0 değiştirmeniz gerekmez. .NET 8, .NET Standard 2.1 ve önceki sürümleri uygular. .NET Standard'dan .NET 8+ 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 8 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 hedeflenizi net8.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. Erişimde en az artış için kullanılabilir özellik kümesini sınırlandıracağınız için .NET Standard 1.x'i hedeflemenizi önermiyoruz.

    .NET Framework'i desteklemeniz gerekmiyorsa .NET Standard 2.1 veya .NET 8 ile gidebilirsiniz. .NET Standard 2.1'i atlamanızı ve doğrudan .NET 8'e geçmenizi öneririz. En yaygın kullanılan kitaplıklar hem .NET Standard 2.0 hem de .NET 5+ için birden çok 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 Standart sorunları

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

  • 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 eklemeye yönelik teklifler 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. Daha sonra .NET Standard'ın yeni sürümünün yaygın olarak desteklenmesi için daha da uzun süre beklersiniz.

    .NET 5+'da çö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'a kıyasla çok daha hızlı yararlanabilirsiniz.

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

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

    .NET 5+ içindeki çö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: net8.0 kitaplıklar, konsol uygulamaları ve web uygulamaları için kullanılır. Tek varyasyon, gibi net8.0-windowsbelirli 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+ içindeki çözüm: .NET 5+ SDK'ları varsayılan olarak etkinleştirilen kod çözümleyicileri içerir. Platform uyumluluk çözümleyicisi, üzerinde çalışmak 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'ın hedefini kullanmanızı öneririz:

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

Ayrıca bkz.