Platformlar arası hedefleme

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.

.NET ve .NET Standard hedefleri

.NET ve .NET Standard hedefleri, .NET kitaplığına platformlar arası destek eklemenin en iyi yoludur.

  • .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 6-8, .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'in .NET Standard ile karşılaştırması hakkında daha fazla bilgi için bkz . .NET 5 ve .NET Standard.

.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 oluşturur PlatformNotSupportedException .
  • 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.

✔️ DO bir netstandard2.0 hedef ekleme ile başlayın.

Genel amaçlı kitaplıkların çoğunun .NET Standard 2.0 dışında API'lere ihtiyacı yoktur. .NET Standard 2.0 tüm modern platformlar tarafından desteklenir ve tek bir hedefle birden çok platformu desteklemenin önerilen yoludur. .NET Framework'i desteklemeniz gerekmiyorsa .NET Standard 2.1'i de hedefleyebilirsiniz.

✔️ Modern bir net6.0 .NET'te yeni API'lere ihtiyaç duyuyorsanız BIR hedef veya daha sonraki bir hedef ekleyin.

.NET 6 ve üzeri uygulamalar bir netstandard2.0 hedef kullanabilir, bu nedenle net6.0 gerekli değildir. Daha yeni .NET API'lerini kullanmak istediğinizde , net7.0veya net8.0 öğesini açıkça hedeflemeniz net6.0gerekir.

❌ 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 hedef gerekiyorsa netstandard1.x DO bir hedef ekleyinnetstandard2.0.

.NET Standard 2.0'ı destekleyen tüm platformlar hedefi kullanır netstandard2.0 ve daha küçük bir paket grafiğine sahip olmanın avantajını elde ederken, eski platformlar çalışmaya devam eder ve hedefi kullanmaya netstandard1.x geri döner.

❌ 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.

Ç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 kalmadan korumak için .NET Standard çıkışına ek olarak çerçeveye özgü 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.

NuGet package with multiple assemblies

✔️ .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 özelliklerin çalışma zamanı açık olmasını 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 aşağı akış gibi bağımlı paketleri, hedef çerçeve başına bağımlı derlemenin 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 *.nupkg boyutu artırır.

✔️ Hedef net462 sunarken netstandard2.0 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 netstandard2.0 and net462 assemblies -->
    <TargetFrameworks>netstandard2.0;net462</TargetFrameworks>
  </PropertyGroup>
</Project>

✔️ Proje dosyanızı büyük ölçüde basitleştirdiğinden UWP ve Xamarin için çoklu hedefleme yaparken MSBuild.Sdk.Extras kullanmayı göz önünde bulundurun.

❌ 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, TFM başına farklı derleme adlarına sahip çoklu hedefleme paket tüketicilerini kesebilir. 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ın mümkün olduğunca çok hedef üzerinde çalışmasını sağlamanın bir değeri olsa da, eksik API'lere geçici bir çözüm bulmak önemli ek yük oluşturabilir. 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.