Obsługiwane rozwiązania międzyplatformowe

Nowoczesna platforma .NET obsługuje wiele systemów operacyjnych i urządzeń. Biblioteki typu open source platformy .NET muszą obsługiwać jak najwięcej deweloperów, niezależnie od tego, czy tworzą witrynę internetową ASP.NET hostowaną na platformie Azure, czy grę .NET w środowisku Unity.

Obiekty docelowe platformy .NET i .NET Standard

Obiekty docelowe platformy .NET i .NET Standard to najlepszy sposób dodawania obsługi międzyplatformowej do biblioteki .NET.

  • .NET Standard to specyfikacja interfejsów API .NET, które są dostępne we wszystkich implementacjach platformy .NET. Określanie platformy .NET Standard umożliwia tworzenie bibliotek, które są ograniczone do używania interfejsów API w danej wersji platformy .NET Standard, co oznacza, że jest to możliwe dla wszystkich platform, które implementują tę wersję platformy .NET Standard.
  • .NET 5 to implementacja platformy .NET, którą firma Microsoft aktywnie opracowuje. Jest to pojedynczy produkt z jednolitym zestawem funkcji i interfejsów API, których można używać do Windows aplikacji klasycznych i międzyplatformowych aplikacji konsolowych, usług w chmurze i witryn internetowych.

Aby uzyskać więcej informacji o tym, jak platforma .NET porównuje się z platformą .NET Standard, zobacz .NET 5 i .NET Standard.

.NET Standard

Ukierunkowanie na platformę .NET lub .NET Standard i pomyślne skompilowanie projektu nie gwarantuje pomyślnego uruchomienia biblioteki na wszystkich platformach:

  1. Interfejsy API specyficzne dla platformy nie będą działać na innych platformach. Na przykład Microsoft.Win32.Registry powiedzie się Windows i zgłosi, PlatformNotSupportedException gdy jest używany w dowolnym innym systemie operacyjnym.
  2. Interfejsy API mogą zachowywać się inaczej. Na przykład interfejsy API odbicia mają różne charakterystyki wydajności, gdy aplikacja używa kompilacji z wyprzedzeniem w systemie iOS lub UWP.

Porada

Zespół platformy .NET oferuje analizator zgodności platformy , który ułatwia wykrywanie możliwych problemów.

✔️ Rozpocznij od dołączania netstandard2.0 elementu docelowego.

Większość bibliotek ogólnego przeznaczenia nie powinna potrzebować interfejsów API spoza platformy .NET Standard 2.0. Platforma .NET Standard 2.0 jest obsługiwana przez wszystkie nowoczesne platformy i jest zalecanym sposobem obsługi wielu platform z jednym celem.

✔️ Dołącz element docelowy net5.0 lub nowszy, jeśli potrzebujesz nowych interfejsów API wprowadzonych w nowoczesnej platformie .NET.

Aplikacje platformy .NET 5 lub nowszej mogą używać netstandard2.0 elementu docelowego, więc net5.0 nie jest wymagane. Jawne określanie wartości docelowej net5.0 powinno być dodawane, gdy chcesz używać nowych interfejsów API platformy .NET.

❌ UNIKAJ dołączania netstandard1.x elementu docelowego.

Program .NET Standard 1.x jest dystrybuowany jako szczegółowy zestaw pakietów NuGet, który tworzy duży graf zależności pakietów i powoduje, że deweloperzy pobierają wiele pakietów podczas kompilowania. Nowoczesne implementacje platformy .NET obsługują platformę .NET Standard 2.0. Docelowy program .NET Standard 1.x powinien być przeznaczony tylko wtedy, gdy konieczne jest użycie starszej platformy.

✔️ Uwzględnij element docelowy netstandard2.0 , jeśli jest wymagany element docelowy netstandard1.x .

Wszystkie platformy obsługujące platformę .NET Standard 2.0 będą używać netstandard2.0 elementu docelowego i korzystać z mniejszego grafu pakietów, podczas gdy starsze platformy nadal będą działać i wracać do korzystania z netstandard1.x elementu docelowego.

❌ Nie dołączaj elementu docelowego platformy .NET Standard, jeśli biblioteka opiera się na modelu aplikacji specyficznym dla platformy.

Na przykład biblioteka zestawów narzędzi kontroli platformy UWP zależy od modelu aplikacji, który jest dostępny tylko w przypadku platformy UWP. Interfejsy API specyficzne dla modelu aplikacji nie będą dostępne w programie .NET Standard.

Wielowersyjność

Czasami konieczne jest uzyskanie dostępu do interfejsów API specyficznych dla platformy z bibliotek. Najlepszym sposobem wywoływania interfejsów API specyficznych dla platformy jest użycie wielowersyjności, która kompiluje projekt dla wielu platform docelowych .NET , a nie tylko dla jednego.

Aby chronić użytkowników przed koniecznością tworzenia dla poszczególnych platform, należy dążyć do uzyskania danych wyjściowych platformy .NET Standard oraz co najmniej jednego danych wyjściowych specyficznych dla platformy. W przypadku wielowersyjność wszystkie zestawy są pakowane wewnątrz jednego pakietu NuGet. Użytkownicy mogą następnie odwoływać się do tego samego pakietu, a NuGet wybierze odpowiednią implementację. Biblioteka .NET Standard służy jako biblioteka rezerwowa używana wszędzie, z wyjątkiem przypadków, w których pakiet NuGet oferuje implementację specyficzną dla platformy. Wielowersyjność umożliwia korzystanie z kompilacji warunkowej w kodzie i wywoływanie interfejsów API specyficznych dla platformy.

NuGet package with multiple assemblies

✔️ ROZWAŻ użycie implementacji platformy .NET oprócz platformy .NET Standard.

Określanie docelowych implementacji platformy .NET umożliwia wywoływanie interfejsów API specyficznych dla platformy, które znajdują się poza platformą .NET Standard.

Nie porzucaj obsługi platformy .NET Standard, gdy to zrobisz. Zamiast tego wyrzuć z implementacji i oferują interfejsy API możliwości. Dzięki temu biblioteka może być używana w dowolnym miejscu i obsługuje podświetlenia funkcji w czasie wykonywania.

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 NET461
        return CallDotNetFramworkApi();
#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 NET461 || WINDOWS_UWP
            return true;
#else
            return false;
#endif
        }
    }
}

❌ UNIKAJ wielowersyjności, a także określania wartości docelowej dla platformy .NET Standard, jeśli kod źródłowy jest taki sam dla wszystkich elementów docelowych.

Zestaw .NET Standard będzie automatycznie używany przez NuGet. Ukierunkowanie na poszczególne implementacje platformy *.nupkg .NET zwiększa rozmiar bez korzyści.

✔️ ROZWAŻ dodanie elementu docelowego, net461 jeśli oferujesz element docelowy netstandard2.0 .

Korzystanie z platformy .NET Standard 2.0 z .NET Framework ma pewne problemy, które zostały rozwiązane w .NET Framework 4.7.2. Możesz ulepszyć środowisko dla deweloperów, którzy są nadal na .NET Framework 4.6.1 - 4.7.1, oferując im plik binarny utworzony dla .NET Framework 4.6.1.

✔️ Dystrybuuj bibliotekę przy użyciu pakietu NuGet.

NuGet wybierze najlepszy element docelowy dla dewelopera i będzie chronić je przed wybraniem odpowiedniej implementacji.

✔️ Należy użyć właściwości pliku TargetFrameworks projektu w przypadku wielowersyjność.

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

✔️ ROZWAŻ użycie MSBuild. Sdk.Extras, gdy wielowersyjność dla platform UWP i Xamarin znacznie upraszcza plik projektu.

Starsze elementy docelowe

Platforma .NET obsługuje docelowe wersje .NET Framework, które nie są już używane, a także platformy, które nie są już używane. Chociaż istnieje wartość umożliwiająca pracę biblioteki nad jak największą liczbą obiektów docelowych, konieczność obejścia brakujących interfejsów API może znacznie zwiększać obciążenie. Uważamy, że niektóre struktury nie są już warte kierowania, biorąc pod uwagę ich zasięg i ograniczenia.

❌ NIE DOŁĄCZAJ elementu docelowego biblioteki klas przenośnych (PCL). Na przykład portable-net45+win8+wpa81+wp8.

.NET Standard to nowoczesny sposób obsługi międzyplatformowych bibliotek .NET i zastępowania bibliotek PCLs.

❌ NIE dołączaj obiektów docelowych dla platform .NET, które nie są już obsługiwane. Na przykład , SL4WP.