Bagikan melalui


Penargetan lintas platform

NET Modern mendukung beberapa sistem operasi dan perangkat. Penting bagi pustaka sumber terbuka .NET untuk mendukung pengembang sebanyak mungkin, baik membangun situs web ASP.NET yang di-hosting di Azure, atau game .NET di Unity.

Target .NET dan .Net Standard

Target .NET dan .NET Standard adalah cara terbaik untuk menambahkan dukungan lintas platform ke pustaka .NET.

  • .NET Standard adalah spesifikasi API .NET yang dimaksudkan untuk tersedia di semua implementasi .NET. Menargetkan .NET Standard memungkinkan Anda menghasilkan pustaka yang dibatasi untuk menggunakan API yang berada dalam versi .NET Standard tertentu, yang berarti dapat digunakan oleh semua platform yang mengimplementasikan versi .NET Standard tersebut.
  • .NET 6-8 adalah implementasi dari .NET. Setiap versi adalah satu produk dengan serangkaian kemampuan dan API seragam yang dapat digunakan untuk aplikasi desktop Windows dan aplikasi konsol lintas platform, layanan cloud, dan situs web.

Untuk informasi selengkapnya tentang bagaimana .NET dibandingkan dengan .NET Standard, lihat .NET 5 dan .NET Standard.

.NET Standard

Jika proyek Anda menargetkan .NET atau .NET Standard dan berhasil dikompilasi, itu tidak menjamin bahwa pustaka akan berjalan dengan sukses di semua platform:

  • API khusus platform akan gagal pada platform lain. Misalnya, Microsoft.Win32.Registry akan berhasil pada Windows dan melempar PlatformNotSupportedException ketika digunakan pada OS lain.
  • API dapat memiliki perilaku yang berbeda. Misalnya, API refleksi memiliki karakteristik performa yang berbeda saat aplikasi menggunakan kompilasi sebelumnya pada iOS atau UWP.

Tip

Tim .NET menawarkan Penganalisis kompatibilitas platform untuk membantu Anda menemukan kemungkinan masalah.

✔️ LAKUKAN mulai dengan menyertakan netstandard2.0 target.

Sebagian besar pustaka tujuan umum tidak memerlukan API di luar .NET Standard 2.0. .NET Standard 2.0 didukung oleh semua platform modern dan merupakan cara yang direkomendasikan untuk mendukung beberapa platform dengan satu target. Jika Anda tidak perlu mendukung .NET Framework, Anda juga dapat menargetkan .NET Standard 2.1.

✔️ LAKUKAN sertakan net6.0 target atau yang lebih baru jika Anda memerlukan API baru yang diperkenalkan dalam .NET modern.

Aplikasi .NET 6 dan yang lebih baru dapat menggunakan netstandard2.0 target, jadi net6.0 tidak diperlukan. Anda harus secara eksplisit menargetkan net6.0, net7.0, atau net8.0 ketika Anda ingin menggunakan API .NET yang lebih baru.

❌ HINDARI memuat netstandard1.x target.

.NET Standard 1.x didistribusikan sebagai sekumpulan paket NuGet terperinci, yang membuat grafik dependensi paket besar dan menghasilkan unduhan banyak paket saat membangun. Implementasi .NET modern mendukung .NET Standard 2.0. Anda hanya boleh menargetkan .NET Standard 1.x jika Anda secara khusus perlu menargetkan platform yang lebih lama.

✔️ LAKUKAN sertakan netstandard2.0 target jika Anda memerlukan netstandard1.x target.

Semua platform yang mendukung .NET Standard 2.0 akan menggunakan netstandard2.0 target dan mendapat manfaat dari memiliki grafik paket yang lebih kecil sementara platform yang lebih lama masih akan berfungsi dan kembali menggunakan netstandard1.x target.

❌ JANGAN sertakan target .NET Standard jika pustaka bergantung pada model aplikasi khusus platform.

Misalnya, pustaka toolkit kontrol UWP bergantung pada model aplikasi yang hanya tersedia di UWP. API khusus model aplikasi tidak tersedia di .NET Standard.

Multi-penargetan

Terkadang Anda perlu mengakses API khusus kerangka kerja dari pustaka Anda. Cara terbaik untuk memanggil API khusus kerangka kerja adalah dengan menggunakan multi-penargetan, yang membangun proyek Anda untuk banyak kerangka kerja target .NET daripada hanya satu.

Untuk melindungi konsumen Anda dari keharusan membangun kerangka kerja individual, Anda harus berusaha untuk memiliki output .NET Standard ditambah satu atau beberapa output khusus kerangka kerja. Dengan Anda multi-target, semua rakitan dimas dalam satu paket NuGet. Konsumen kemudian dapat mereferensikan paket yang sama dan NuGet akan memilih implementasi yang sesuai. Pustaka .NET Standard Anda berfungsi sebagai pustaka fallback yang digunakan di mana saja, kecuali untuk kasus di mana paket NuGet Anda menawarkan implementasi khusus kerangka kerja. Penargetan ganda memungkinkan Anda menggunakan kompilasi kondisional dalam kode Anda dan memanggil API khusus kerangka kerja.

NuGet package with multiple assemblies

✔️ PERTIMBANGKAN untuk menargetkan implementasi .NET selain .NET Standard.

Menargetkan implementasi .NET memungkinkan Anda memanggil API khusus platform yang berada di luar .NET Standard.

Jangan hilangkan dukungan untuk .NET Standard saat Anda melakukan ini. Sebagai gantinya, lemparkan dari implementasi dan tawarkan API kemampuan. Dengan cara ini, pustaka Anda dapat digunakan di mana saja dan mendukung penerangan fitur run-time.

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
        }
    }
}

✔️ PERTIMBANGKAN multi-penargetan meskipun kode sumber Anda sama untuk semua target, ketika proyek Anda memiliki dependensi pustaka atau paket.

Paket dependen proyek Anda, baik langsung atau hilir, mungkin menggunakan API kode yang sama saat dibungkus di dalam versi rakitan dependen yang berbeda per kerangka kerja target. Menambahkan target tertentu memastikan bahwa konsumen Anda tidak perlu menambahkan atau memperbarui pengalihan pengikatan perakitan mereka.

❌ HINDARI multi-penargetan serta menargetkan .NET Standard, jika kode sumber Anda sama untuk semua target dan proyek Anda tidak memiliki dependensi pustaka atau paket.

Rakitan .NET Standard akan secara otomatis digunakan oleh NuGet. Menargetkan implementasi .NET individu meningkatkan *.nupkg ukuran tanpa manfaat.

✔️ PERTIMBANGKAN untuk menambahkan target net462 saat Anda menawarkan netstandard2.0 target.

Menggunakan .NET Standard 2.0 dari .NET Framework memiliki beberapa masalah yang ditangani di .NET Framework 4.7.2. Anda dapat meningkatkan pengalaman bagi pengembang yang masih berada di .NET Framework 4.6.2 - 4.7.1 dengan menawarkan biner yang dibuat untuk .NET Framework 4.6.2.

✔️ Distribusikan pustaka Anda menggunakan paket NuGet.

NuGet akan memilih target terbaik untuk pengembang dan melindungi mereka selama memilih implementasi yang sesuai.

✔️ LAKUKAN menggunakan properti file TargetFrameworks proyek saat melakukan penargetan ganda.

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <!-- This project will output netstandard2.0 and net462 assemblies -->
    <TargetFrameworks>netstandard2.0;net462</TargetFrameworks>
  </PropertyGroup>
</Project>

✔️ PERTIMBANGKAN untuk menggunakan MSBuild.Sdk.Extras saat melakukan penargetan ganda untuk UWP dan Xamarin karena sangat menyederhanakan file proyek Anda.

❌ HINDARI mengubah nama rakitan atau menggunakan nama rakitan yang berbeda untuk setiap TFM yang dikompilasi pustaka Anda. Karena dependensi antar pustaka, multi-penargetan dengan nama rakitan yang berbeda per TFM dapat merusak konsumen paket. Rakitan harus memiliki nama yang sama di semua TFM.

Target yang lebih lama

.NET mendukung penargetan versi .NET Framework yang tidak didukung serta platform yang tidak lagi digunakan secara umum. Meskipun terdapat nilai dalam pembuatan pustaka Anda yang bekerja pada target sebanyak mungkin, mengatasi API yang hilang dapat menambahkan overhead yang signifikan. Mempertimbangkan jangkauan dan batasannya, kerangka kerja tertentu tidak lagi layak untuk ditargetkan.

❌ JANGAN sertakan target Portable Class Library (PCL). Contohnya,portable-net45+win8+wpa81+wp8.

.NET Standard adalah cara modern untuk mendukung pustaka .NET lintas platform dan menggantikan PCL.

❌ JANGAN sertakan target untuk platform .NET yang tidak lagi didukung. Misalnya, SL4, WP.