Sdílet prostřednictvím


Vytváření a využívání vlastních architektur pro platformy podobné iOSu

Od .NET 9 podporuje nativní AOT publikování knihoven tříd .NET, které nezávisí na úlohách iOSu pro platformy podobné iOSu. Tato podpora umožňuje vytvářet samostatné nativní knihovny, které lze využívat z aplikací pro iOS, Mac Catalyst a tvOS.

Důležité

Tento přístup nepřichází s integrovanou podporou interoperability Objective-C a k dosažení interoperability mohou být vyžadovány další úpravy kódu (například sřazování argumentů typu odkazu).

Vytváření sdílených knihoven

Tato část popisuje postup vytvoření jednoduchého projektu knihovny tříd .NET s podporou NativeAOT a vytvoření nativní knihovny pro platformy podobné iOSu.

  1. Stažení sady .NET 9 SDK

  2. Vytvoření projektu knihovny tříd

    dotnet new classlib -n "MyNativeAOTLibrary"
    
  3. Do souboru projektu přidejte následující vlastnosti. MyNativeAOTLibrary.csproj

    <PublishAot>true</PublishAot>
    <PublishAotUsingRuntimePack>true</PublishAotUsingRuntimePack>
    
  4. MyNativeAOTLibrary/Class1.cs Upravte zdrojový kód tak, aby zpřístupnil spravovanou metodu, aby na ni bylo možné odkazovat z nativního kódu jako aotsample_add. Příklad:

    using System.Runtime.InteropServices;
    namespace NaotLib;
    
    public class Class1
    {
        [UnmanagedCallersOnly(EntryPoint = "aotsample_add")]
        public static int Add(int a, int b)
        {
            return a + b;
        }
    }
    
  5. Publikujte knihovnu tříd a cílte na požadovanou platformu typu iOS zadáním příslušného identifikátoru modulu runtime (na který odkazujeme níže <rid>):

    dotnet publish -r <rid> MyNativeAOTLibrary/MyNativeAOTLibrary.csproj
    

Úspěšné dokončení předchozího kroku vytvoří dvojici souborů: sdílenou knihovnu MyNativeAOTLibrary.dylib a její symboly MyNativeAOTLibrary.dylib.dSYMladění , které jsou umístěny v: MyNativeAOTLibrary/bin/Release/net9.0/<rid>/publish/.

Poznámka:

Pro vytváření univerzálních architektur je nutné publikovat knihovnu tříd pro Arm64 danou platformu i x64 architekturu. To znamená, že potřebujete opakovat krok 5 s jiným identifikátorem modulu runtime. Knihovnu tříd byste například publikovali s maccatalyst-arm64 identifikátory runtime i maccatalyst-x64 identifikátory modulu runtime jako předpoklad pro zabalení sdílené knihovny do vlastní univerzální architektury MacCatalyst.

Vytvoření a využití vlastní architektury

Apple vyžaduje, aby sdílené knihovny (.dylibs) bylo potřeba zabalit do architektur, aby je bylo možné využívat z aplikací.

Tato část popisuje všechny požadované kroky k dosažení tohoto problému a jednoduchý scénář aplikace iOS/MacCatalyst, která využívá sdílenou knihovnu nebo architekturu NativeAOT.

Poznámka:

Popsané kroky jsou určené jenom pro demonstrační účely. Skutečné požadavky se můžou lišit v závislosti na přesném případu použití.

Zabalení sdílené knihovny do vlastní architektury iOS

  1. Vytvořte složku architektury:

    mkdir MyNativeAOTLibrary.framework
    
  2. Upravit příkazy pro načtení:

    • LC_RPATH příkaz pro načtení

      install_name_tool -rpath @executable_path @executable_path/Frameworks MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib
      
    • LC_ID_DYLIB příkaz pro načtení

      install_name_tool -id @rpath/MyNativeAOTLibrary.framework/MyNativeAOTLibrary MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib
      
  3. Ručně zabalte binární soubor do univerzálního souboru:

    lipo -create MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib -output MyNativeAOTLibrary.framework/MyNativeAOTLibrary
    
  4. Přidejte soubor seznamu vlastností do architektury:

    • Vytvoření Info.plist souboru
    touch MyNativeAOTLibrary.framework/Info.plist
    
    • Přidání obsahu z dodatku

Po posledním kroku by struktura architektury měla vypadat takto:

MyNativeAOTLibrary.framework
    |_ MyNativeAOTLibrary
    |_ Info.plist

Zabalení sdílené knihovny do vlastní univerzální architektury MacCatalyst

Univerzální architektury vyžadují binární soubory jak pro architekturu, tak Arm64x64 pro architekturu. Z tohoto důvodu musíte předem publikovat nativní knihovny, které cílí na obě následující identifikátory RID: maccatalyst-arm64 a maccatalyst-x64.

  1. Vytvoření struktury složek architektury:

    mkdir -p MyNativeAOTLibrary.framework/Versions/A/Resources
    ln -sfh Versions/Current/MyNativeAOTLibrary MyNativeAOTLibrary.framework/MyNativeAOTLibrary
    ln -sfh Versions/Current/Resources MyNativeAOTLibrary.framework/Resources
    ln -sfh A MyNativeAOTLibrary.framework/Versions/Current
    
  2. Upravit příkazy pro načtení:

    • LC_RPATH příkaz pro načtení

      install_name_tool -rpath @executable_path @executable_path/../Frameworks MyNativeAOTLibrary/bin/Release/net9.0/maccatalyst-arm64/publish/MyNativeAOTLibrary.dylib
      install_name_tool -rpath @executable_path @executable_path/../Frameworks MyNativeAOTLibrary/bin/Release/net9.0/maccatalyst-x64/publish/MyNativeAOTLibrary.dylib
      
    • LC_ID_DYLIB příkaz pro načtení

      install_name_tool -id @rpath/MyNativeAOTLibrary.framework/Versions/A/MyNativeAOTLibrary MyNativeAOTLibrary/bin/Release/net9.0/maccatalyst-arm64/publish/MyNativeAOTLibrary.dylib
      install_name_tool -id @rpath/MyNativeAOTLibrary.framework/Versions/A/MyNativeAOTLibrary MyNativeAOTLibrary/bin/Release/net9.0/maccatalyst-x64/publish/MyNativeAOTLibrary.dylib
      
  3. Ručně zabalte binární soubor do univerzálního souboru:

    lipo -create MyNativeAOTLibrary/bin/Release/net9.0/maccatalyst-arm64/publish/MyNativeAOTLibrary.dylib MyNativeAOTLibrary/bin/Release/net9.0/maccatalyst-x64/publish/MyNativeAOTLibrary.dylib -output MyNativeAOTLibrary.framework/Versions/A/MyNativeAOTLibrary
    
  4. Přidejte soubor seznamu vlastností do architektury:

    • Vytvoření Info.plist souboru
    touch MyNativeAOTLibrary.framework/Versions/A/Resources/Info.plist
    
    • Přidání obsahu z dodatku

Po posledním kroku by struktura architektury měla vypadat takto:

MyNativeAOTLibrary.framework
    |_ MyNativeAOTLibrary -> Versions/Current/MyNativeAOTLibrary
    |_ Resources -> Versions/Current/Resources
    |_ Versions
        |_ A
        |   |_ Resources
        |   |   |_ Info.plist
        |   |_ MyNativeAOTLibrary
        |_ Current -> A

Využívání vlastních architektur

  1. Otevřít Xcode (v tomto příkladu Xcode 16.0 se používá)

  2. Vytvoření nového App projektu

  3. Zvolte název aplikace (například MyiOSApp) a jako zdrojový jazyk zvolte Objective-C.

  4. Přidání odkazu na architekturu MyNativeAOTLibrary

    • MyiOSApp Na kartě Cíle Obecné v části Architektury, Knihovny a Vložený obsah vyberte + přidat MyNativeAOTLibrary jako odkazovanou architekturu.
    • V dialogovém okně zvolte Přidat další ->Přidat soubory a pak přejděte do umístění a vyberte ho MyNativeAOTLibrary.framework .
    • Po výběru nastavte Embed and Sign možnost pro MyNativeAOTLibrary architekturu.

    Přidat odkaz na framework v Xcode

  5. Přidání MyNativeAOTLibrary.framework umístění do seznamu cest hledání rozhraní na kartě Nastavení sestavení

    Přidat cestu k vyhledání frameworku v Xcode

  6. Upravit main.m zavoláním vystavené spravované metody aotsample_add a tiskem výsledku

    extern int aotsample_add(int a, int b);
    int main(int argc, char * argv[]) {
        ...
        NSLog(@"2 + 5 = %d", aotsample_add(2, 5));
        ...
    }
    
  7. Vyberte fyzické zařízení s iOSem a sestavte nebo spusťte aplikaci.

  8. Zkontrolujte protokoly po úspěšném spuštění aplikace. Aplikace by se měla vytisknout: 2 + 5 = 7

Poznámka:

Pro MacCatalyst použijte stejný postup s výjimkou kroku 7, kde musí být cíl spuštění nastaven jako: Mac (Mac Catalyst).

Vytváření statických knihoven pomocí NativeAOT pro platformy podobné iOSu

Jak je popsáno v přehledu vytváření nativních knihoven, je lepší vytvářet sdílené knihovny nad statickými knihovnami kvůli několika omezením.

V případě potřeby ale můžete statickou knihovnu vytvořit pomocí kroků pro sestavení sdíleného knihovny a zahrnout do souboru projektu další vlastnost:

<NativeLib>Static</NativeLib>

Po publikování projektu lze statickou knihovnu MyNativeAOTLibrary.a najít na adrese: MyNativeAOTLibrary/bin/Release/net9.0/<rid>/publish.

Tento článek se nezabývá tím, jak využívat statickou knihovnu a nakonfigurovat projekt příjemce.

Obsah přílohy Info.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CFBundleName</key>
    <string>MyNativeAOTLibrary</string>
    <key>CFBundleIdentifier</key>
    <string>com.companyname.MyNativeAOTLibrary</string>
    <key>CFBundleVersion</key>
    <string>1.0</string>
    <key>CFBundleExecutable</key>
    <string>MyNativeAOTLibrary</string>
    <key>CFBundlePackageType</key>
    <string>FMWK</string>
</dict>
</plist>