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 load command

      install_name_tool -rpath @executable_path @executable_path/Frameworks MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib
      
    • LC_ID_DYLIB load command

      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
    

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 Arm64 x64 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 load command

      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 load command

      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
    

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.

    Xcode add framework reference

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

    Xcode add framework search path

  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>