Delen via


Aangepaste frameworks maken en gebruiken voor iOS-achtige platforms

Vanaf .NET 9 biedt Native AOT ondersteuning voor het publiceren van .NET-klassebibliotheken die niet afhankelijk zijn van iOS-workloads voor iOS-achtige platforms. Met deze ondersteuning kunt u zelfstandige systeemeigen bibliotheken maken die kunnen worden gebruikt vanuit iOS-, Mac Catalyst- en tvOS-toepassingen.

Belangrijk

Deze aanpak wordt niet geleverd met de ingebouwde ondersteuning voor objective-C-interoperabiliteit en er zijn mogelijk aanvullende codeaanpassingen vereist (zoals marshalling van referentietypeargumenten) om interoperabiliteit te bereiken.

Gedeelde bibliotheken bouwen

In deze sectie worden de stappen beschreven voor het maken van een eenvoudig .NET-klassebibliotheekproject met nativeAOT-ondersteuning en het produceren van een systeemeigen bibliotheek voor iOS-achtige platforms.

  1. .NET 9 SDK downloaden

  2. Een klassebibliotheekproject maken

    dotnet new classlib -n "MyNativeAOTLibrary"
    
  3. Voeg de volgende eigenschappen toe aan het projectbestand MyNativeAOTLibrary.csproj

    <PublishAot>true</PublishAot>
    <PublishAotUsingRuntimePack>true</PublishAotUsingRuntimePack>
    
  4. Bewerk de MyNativeAOTLibrary/Class1.cs broncode om een beheerde methode beschikbaar te maken, zodat er vanuit de systeemeigen code naar kan worden verwezen als aotsample_add. Voorbeeld:

    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. Publiceer de klassebibliotheek en richt u op het gewenste iOS-achtige platform door de juiste runtime-id op te geven (waarnaar hieronder wordt verwezen als <rid>):

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

Geslaagde voltooiing van de vorige stap produceert een paar bestanden: een gedeelde bibliotheek MyNativeAOTLibrary.dylib en de bijbehorende foutopsporingssymbolen MyNativeAOTLibrary.dylib.dSYM, die zich bevinden op: MyNativeAOTLibrary/bin/Release/net9.0/<rid>/publish/.

Notitie

Voor het maken van universele frameworks is het vereist om de klassebibliotheek voor zowel als Arm64 x64 architecturen voor een bepaald platform te publiceren. Dit betekent dat u stap 5 moet herhalen met een andere runtime-id. U publiceert bijvoorbeeld de klassebibliotheek met beide maccatalyst-arm64 en maccatalyst-x64 runtime-id's als een vereiste voor het verpakken van de gedeelde bibliotheek in een aangepast universeel MacCatalyst-framework.

Een aangepast framework maken en gebruiken

Apple legt een vereiste op dat gedeelde bibliotheken (.dylibs) moeten worden verpakt in frameworks om te kunnen worden gebruikt vanuit toepassingen.

In deze sectie worden alle vereiste stappen beschreven om dit te bereiken en een eenvoudig scenario van een iOS-/MacCatalyst-toepassing die gebruikmaakt van een gedeelde NativeAOT-bibliotheek/-framework.

Notitie

De beschreven stappen zijn alleen bedoeld voor demonstratiedoeleinden. De werkelijke vereisten kunnen verschillen, afhankelijk van de exacte use-case.

De gedeelde bibliotheek verpakken in een aangepast iOS-framework

  1. Een frameworkmap maken:

    mkdir MyNativeAOTLibrary.framework
    
  2. Laadopdrachten aanpassen:

    • LC_RPATH opdracht laden

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

      install_name_tool -id @rpath/MyNativeAOTLibrary.framework/MyNativeAOTLibrary MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib
      
  3. Pakket het binaire bestand handmatig in een universeel bestand:

    lipo -create MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib -output MyNativeAOTLibrary.framework/MyNativeAOTLibrary
    
  4. Voeg een eigenschappenlijstbestand toe aan uw framework:

    • Info.plist Een bestand maken
    touch MyNativeAOTLibrary.framework/Info.plist
    
    • De inhoud van de bijlage toevoegen aan het gemaakte Info.plist bestand

Na de laatste stap moet de structuur van het framework er als volgt uitzien:

MyNativeAOTLibrary.framework
    |_ MyNativeAOTLibrary
    |_ Info.plist

De gedeelde bibliotheek verpakken in een aangepast universeel MacCatalyst-framework

Universele frameworks vereisen binaire bestanden voor zowel als Arm64 x64 architectuur. Daarom moet u vooraf systeemeigen bibliotheken publiceren die zijn gericht op beide volgende RID's: maccatalyst-arm64 en maccatalyst-x64.

  1. Maak een structuur van een frameworkmap:

    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. Laadopdrachten aanpassen:

    • LC_RPATH opdracht laden

      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 opdracht laden

      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. Pakket het binaire bestand handmatig in een universeel bestand:

    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. Voeg een eigenschappenlijstbestand toe aan uw framework:

    • Info.plist Een bestand maken
    touch MyNativeAOTLibrary.framework/Versions/A/Resources/Info.plist
    
    • De inhoud van de bijlage toevoegen aan het gemaakte Info.plist bestand

Na de laatste stap moet de structuur van het framework er als volgt uitzien:

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

Aangepaste frameworks gebruiken

  1. Openen Xcode (in dit voorbeeld Xcode 16.0 wordt gebruikt)

  2. Een nieuw App project maken

  3. Kies de naam voor uw app (bijvoorbeeld MyiOSApp) en kies Objective-C als brontaal

  4. Een verwijzing naar het MyNativeAOTLibrary framework toevoegen

    • Selecteer op het tabblad Algemeen onder Frameworks, Bibliotheken en Ingesloten inhoud de optie + om toe te voegen MyNativeAOTLibrary als het framework waarnaar wordt verwezen MyiOSApp
    • Kies In het dialoogvenster Andere> bestanden toevoegen en blader naar de locatie van MyNativeAOTLibrary.framework en selecteer het
    • Zodra deze optie is geselecteerd, stelt u de Embed and Sign optie voor MyNativeAOTLibrary framework in

    Naslaginformatie over Xcode add framework

  5. Locatie toevoegen MyNativeAOTLibrary.framework aan de lijst met frameworkzoekpaden op het tabblad Build Settings

    Xcode add framework search path

  6. Bewerken main.m door de weergegeven beheerde methode aotsample_add aan te roepen en het resultaat af te drukken

    extern int aotsample_add(int a, int b);
    int main(int argc, char * argv[]) {
        ...
        NSLog(@"2 + 5 = %d", aotsample_add(2, 5));
        ...
    }
    
  7. Selecteer uw fysieke iOS-apparaat en bouw/voer de app uit

  8. Controleer de logboeken nadat de app is gestart. De app moet worden afgedrukt: 2 + 5 = 7

Notitie

Voor MacCatalyst gebruikt u dezelfde stappen, met uitzondering van stap 7, waarbij de uitvoeringsbestemming moet worden ingesteld als: Mac (Mac Catalyst).

Statische bibliotheken bouwen met NativeAOT voor iOS-achtige platforms

Zoals beschreven in het overzicht van systeemeigen bibliotheken bouwen, is het beter om gedeelde bibliotheken te bouwen ten opzichte van statische bibliotheken vanwege verschillende beperkingen.

Indien gewenst kunt u echter een statische bibliotheek bouwen door de stappen te volgen voor het bouwen van een gedeelde bibliotheek en het toevoegen van een extra eigenschap in het projectbestand:

<NativeLib>Static</NativeLib>

Nadat het project is gepubliceerd, kunt u de statische bibliotheek MyNativeAOTLibrary.a vinden op: MyNativeAOTLibrary/bin/Release/net9.0/<rid>/publish.

In dit artikel wordt niet beschreven hoe u de statische bibliotheek gebruikt en het consumentenproject configureert.

Bijlage Info.plist-inhoud

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