Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Modern .NET, birden çok işletim sistemini ve cihazı destekler. .NET açık kaynak kitaplıklarının, Azure'da barındırılan bir ASP.NET web sitesi veya Unity'de bir .NET oyunu oluşturmaları durumunda mümkün olduğunca çok geliştiriciyi desteklemesi önemlidir.
Kitaplığınız için hedef çerçeveleri seçerken iki farklı hedefi ayırt etmek önemlidir:
- ** Modern API'ler ve desenler: Kitaplığınız .NET platformunun son sürümlerinin avantajlarını etkin bir şekilde kullanmaktadır. Modern dil desenlerini kullanır ve CoreCLR'de Yerel Önceden Derleme gibi gelişmiş dağıtım modellerini desteklersiniz.
- İçerik hedefleme: Kitaplığınız, farklı kullanıcı senaryolarında uyumluluğu en üst düzeye çıkarmak için çok çeşitli .NET uygulamalarını ve sürümlerini destekler.
Bu hedefler her zaman aynı yaklaşımı gerektirmez. Hedef uygulamalarınızın tümü modern .NET kullanıyorsa, kitaplıklarınız eski çerçeveleri hedeflemeye gerek kalmadan aynı modern .NET sürümlerini hedefleyebilir.
.NET ve .NET Standard hedefleri
.NET ve .NET Standard hedefleri, .NET kitaplığına platformlar arası destek eklemenin en iyi yoludur.
- .NET'in 5 ile 10 arasında sürümleri .NET'in uygulamalarıdır. Her sürüm, Windows masaüstü uygulamaları ve platformlar arası konsol uygulamaları, bulut hizmetleri ve web siteleri için kullanılabilecek tek bir özellik ve API kümesine sahip tek bir üründür.
- .NET Standard , tüm .NET uygulamalarında kullanılabilen bir .NET API'leri belirtimidir. .NET Standard'ı hedeflemek, .NET Standard'ın belirli bir sürümündeki API'leri kullanmak için kısıtlanmış kitaplıklar oluşturmanıza olanak tanır. Bu, .NET Standard'ın bu sürümünü uygulayan tüm platformlar tarafından kullanılabildiği anlamına gelir.
.NET'in .NET Standard ile karşılaştırması hakkında daha fazla bilgi için bkz . .NET 5 ve .NET Standard.
Projeniz .NET veya .NET Standard'ı hedefler ve başarıyla derlenirse, kitaplığın tüm platformlarda başarıyla çalışacağını garanti etmez:
- Platforma özgü API'ler diğer platformlarda başarısız olur. Örneğin, Microsoft.Win32.Registry Windows'ta başarılı olur ve başka bir işletim sisteminde kullanıldığında PlatformNotSupportedException hatası verir.
- API'ler farklı davranabilir. Örneğin, bir uygulama iOS veya UWP üzerinde önceden derleme kullandığında yansıma API'leri farklı performans özelliklerine sahiptir.
İpucu
.NET ekibi, olası sorunları keşfetmenize yardımcı olmak için bir Platform uyumluluk çözümleyicisi sunar.
✔️ Yeni kitaplıklar için net8.0 hedef veya sonrasında ekleme ile başlayın.
Yeni kitaplıklar için modern .NET'i (.NET 8 veya üzeri gibi) hedeflemek en son API'lere ve performans iyileştirmelerine erişim sağlar ve AOT ve kırpma gibi özellikleri etkinleştirir. Modern .NET sürümleri platformlar arasıdır ve Windows, Linux ve macOS genelinde mükemmel uyumluluk sağlar.
✔️ Geniş bir uyumluluk veya .NET Framework desteğine ihtiyacınız varsa bir netstandard2.0 hedef eklemeyi göz önünde bulundurun.
.NET Standard 2.0, .NET Framework 4.6.1+ ve tüm modern .NET uygulamaları tarafından desteklenir. .NET Framework uygulamalarını desteklemeniz gerektiğinde veya farklı .NET ekosistemlerinde en yüksek uyumluluk için kitaplıklar oluştururken bu hedefi ekleyin.
❌ Bir hedef eklemeKTEN netstandard1.x KAÇıNıN.
.NET Standard 1.x, büyük bir paket bağımlılığı grafiği oluşturan ve derleme sırasında çok sayıda paketin indirilmesine neden olan ayrıntılı bir NuGet paketleri kümesi olarak dağıtılır. Modern .NET uygulamaları .NET Standard 2.0'i destekler. Yalnızca eski bir platformu hedeflemeniz gerekiyorsa .NET Standard 1.x'i hedeflemeniz gerekir.
✔️ Bir netstandard2.0 hedefe ihtiyacınız varsa bir netstandard1.x hedef ekleyin.
.NET Standard 2.0'ı destekleyen tüm platformlar
netstandard2.0hedefini kullanacak ve daha küçük bir paket grafiğinden faydalanacak, eski platformlar ise çalışmaya devam edecek venetstandard1.xhedefini kullanarak işlevselliklerini sürdürecektir.
❌ Kitaplık platforma özgü bir uygulama modeli kullanıyorsa .NET Standard hedefi EKLEMEYİN.
Örneğin, UWP denetim araç seti kitaplığı yalnızca UWP'de kullanılabilen bir uygulama modeline bağlıdır. Uygulama modeline özgü API'ler .NET Standard'da kullanılamaz.
❌ Projeniz veya bağımlılıklarınız birden çok hedefe sahipse netstandard2.0 YAYIMLAMAYIN.
netstandard2.0çalışma zamanı değildir ve çok hedefli projeler, diğer çerçevelerde çalışmak için gerekli olan, bir çalışma zamanı çerçevesine özgü kitaplık sağlar.
Çoklu hedefleme
Bazen kitaplıklarınızdan çerçeveye özgü API'lere erişmeniz gerekir. Çerçeveye özgü API'leri çağırmanın en iyi yolu, projenizi tek bir çerçeve yerine birçok .NET hedef çerçevesi için oluşturan çoklu hedeflemeyi kullanmaktır.
Tüketicilerinizi tek tek çerçeveler için derlemek zorunda kalmaktan korumak için, .NET Standard çıkışına ek olarak çerçeveye özel bir veya daha fazla çıktıya sahip olmaya çabalamalısınız. Çoklu hedefiniz sayesinde tüm derlemeler tek bir NuGet paketi içinde paketlenir. Tüketiciler daha sonra aynı pakete başvurabilir ve NuGet uygun uygulamayı seçer. .NET Standard kitaplığınız, NuGet paketinizin çerçeveye özgü bir uygulama sunduğu durumlar dışında her yerde kullanılan geri dönüş kitaplığı görevi görür. Çoklu hedefleme, kodunuzda koşullu derleme kullanmanıza ve çerçeveye özgü API'leri çağırmanıza olanak tanır.
✔️ .NET Standard'a ek olarak .NET uygulamalarını hedeflemeyi GÖZ ÖNÜNDE BULUNDURUN.
.NET uygulamalarını hedeflemek, .NET Standard dışındaki platforma özgü API'leri çağırmanızı sağlar.
Bunu yaparken .NET Standard desteğini bırakmayın. Bunun yerine uygulamadan oluşturun ve yetenek API'leri sunun. Bu şekilde, kitaplığınız her yerde kullanılabilir ve çalışma zamanında özelliklerin dinamik etkinleşmesini destekler.
public static class GpsLocation
{
// This project uses multi-targeting to expose device-specific APIs to .NET Standard.
public static async Task<(double latitude, double longitude)> GetCoordinatesAsync()
{
#if NET462
return CallDotNetFrameworkApi();
#elif WINDOWS_UWP
return CallUwpApi();
#else
throw new PlatformNotSupportedException();
#endif
}
// Allows callers to check without having to catch PlatformNotSupportedException
// or replicating the OS check.
public static bool IsSupported
{
get
{
#if NET462 || WINDOWS_UWP
return true;
#else
return false;
#endif
}
}
}
✔️ Projenizde kitaplık veya paket bağımlılıkları olduğunda kaynak kodunuz tüm hedefler için aynı olsa bile çoklu hedeflemeyi göz önünde bulundurun.
Projenizin doğrudan veya dolaylı olarak bağımlı paketleri, hedef çerçeveye göre bağımlı kütüphanelerin farklı sürümlerinde sarmalanmış durumdayken aynı kod API'lerini kullanabilir. Belirli hedefler eklemek, tüketicilerinizin derleme bağlama yeniden yönlendirmelerini eklemesine veya güncelleştirmesine gerek olmamasını sağlar.
❌ Kaynak kodunuz tüm hedefler için aynıysa ve projenizde kitaplık veya paket bağımlılıkları yoksa, .NET Standard'ı hedeflemenin yanı sıra çoklu hedeflemeden kaçının.
.NET Standard derlemesi NuGet tarafından otomatik olarak kullanılır. Tek tek .NET uygulamalarını hedeflemek, avantaj sağlamadan
*.nupkgboyutu artırır.
✔️ net462 hedeflediğinizde, netstandard2.0 için bir hedef eklemeyi göz önünde bulundurun.
.NET Framework'ten .NET Standard 2.0 kullanıldığında .NET Framework 4.7.2'de giderilen bazı sorunlar vardır. .NET Framework 4.6.2 - 4.7.1 üzerinde olan geliştiricilere .NET Framework 4.6.2 için oluşturulmuş bir ikili dosya sunarak bu deneyimi geliştirebilirsiniz.
✔️ DO, kitaplığınızı nuget paketi kullanarak dağıtır.
NuGet, geliştirici için en iyi hedefi seçer ve uygun uygulamayı seçmeleri için koruma sağlar.
✔️ DO, birden çok hedefleme sırasında proje dosyasının TargetFrameworks özelliğini kullanır.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<!-- This project will output net8.0 and netstandard2.0 assemblies -->
<TargetFrameworks>net8.0;netstandard2.0</TargetFrameworks>
</PropertyGroup>
</Project>
❌ Derleme adını değiştirmekten veya kitaplığınızın derlediği her TFM için farklı derleme adları kullanmaktan KAÇıNıN. Kitaplıklar arasındaki bağımlılıklar nedeniyle, her TFM için farklı derleme adlarına sahip çoklu hedefleme paket tüketicileri için sorun yaratabilir. Derleme tüm TFM'lerde aynı ada sahip olmalıdır.
Eski hedefler
.NET, destek dışı olan .NET Framework sürümlerinin yanı sıra artık ortak kullanımda olmayan platformları hedeflemeyi destekler. Kitaplığınızı mümkün olduğunca çok hedefte çalıştırabilmek değerli olsa da, eksik API'lere çözüm bulmak önemli ölçüde ek zorluklar yaratabilir. Erişimleri ve sınırlamaları dikkate alındığında, bazı çerçeveler artık hedeflemeye değmemektedir.
❌ Taşınabilir Sınıf Kitaplığı (PCL) hedefi EKLEMEYİN. Örneğin, portable-net45+win8+wpa81+wp8.
.NET Standard, platformlar arası .NET kitaplıklarını desteklemenin modern yoludur ve PCL'lerin yerini alır.
❌ Artık desteklenmeyen .NET platformları için hedefler EKLEMEYİN. Örneğin, SL4, WP.