Partager via


Créer et consommer des frameworks personnalisés pour les plateformes similaires à iOS

À partir de .NET 9, Native AOT prend en charge la publication de bibliothèques de classes .NET qui ne dépendent pas des charges de travail iOS pour les plateformes similaires à iOS. Cette prise en charge vous permet de créer des bibliothèques natives autonomes qui peuvent être consommées à partir d’applications iOS, Mac Catalyst et tvOS.

Important

Cette approche ne vient pas avec la prise en charge intégrée de l’interopérabilité Objective-C et des adaptations de code supplémentaires peuvent être requises (telles que le marshaling des arguments de type de référence) pour obtenir l’interopérabilité.

Créer des bibliothèques partagées

Cette section décrit les étapes de création d’un projet de bibliothèque de classes .NET simple avec prise en charge nativeAOT et produit une bibliothèque native pour les plateformes iOS à partir de celle-ci.

  1. Télécharger le Kit de développement logiciel (SDK) .NET 9

  2. Créer un projet de bibliothèque de classes

    dotnet new classlib -n "MyNativeAOTLibrary"
    
  3. Ajoutez les propriétés suivantes dans le fichier projet MyNativeAOTLibrary.csproj

    <PublishAot>true</PublishAot>
    <PublishAotUsingRuntimePack>true</PublishAotUsingRuntimePack>
    
  4. Modifiez le MyNativeAOTLibrary/Class1.cs code source pour exposer une méthode managée afin qu’elle puisse être référencée à partir du code natif en tant que aotsample_add. Par exemple :

    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. Publiez la bibliothèque de classes et ciblez la plateforme iOS souhaitée en spécifiant l’identificateur d’exécution approprié (référencé ci-dessous en tant que <rid>) :

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

La réussite de l’étape précédente produit une paire de fichiers : une bibliothèque MyNativeAOTLibrary.dylib partagée et ses symboles MyNativeAOTLibrary.dylib.dSYMde débogage, qui se trouvent à : MyNativeAOTLibrary/bin/Release/net9.0/<rid>/publish/.

Remarque

Pour créer des frameworks universels, il est nécessaire de publier la bibliothèque de classes pour les architectures Arm64 et x64 les architectures d’une plateforme donnée. Cela signifie que vous devez répéter l’étape 5 avec un identificateur d’exécution différent. Par exemple, vous allez publier la bibliothèque de classes avec des identificateurs d’exécution et maccatalyst-x64 des maccatalyst-arm64 identificateurs d’exécution comme prérequis pour empaqueter la bibliothèque partagée dans une infrastructure macCatalyst universelle personnalisée.

Créer et consommer une infrastructure personnalisée

Apple impose une exigence selon laquelle les bibliothèques partagées (.dylibs) doivent être empaquetées dans des frameworks afin d’être consommées à partir d’applications.

Cette section décrit toutes les étapes requises pour ce faire et un scénario simple d’une application iOS/MacCatalyst consommant une bibliothèque/framework NativeAOT partagée.

Remarque

Les étapes décrites sont uniquement à des fins de démonstration. Les exigences réelles peuvent différer selon le cas d’usage exact.

Empaqueter la bibliothèque partagée dans une infrastructure iOS personnalisée

  1. Créez un dossier d’infrastructure :

    mkdir MyNativeAOTLibrary.framework
    
  2. Ajuster les commandes de chargement :

    • LC_RPATH commande load

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

      install_name_tool -id @rpath/MyNativeAOTLibrary.framework/MyNativeAOTLibrary MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib
      
  3. Empaqueter manuellement le fichier binaire dans un fichier universel :

    lipo -create MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib -output MyNativeAOTLibrary.framework/MyNativeAOTLibrary
    
  4. Ajoutez un fichier de liste de propriétés à votre infrastructure :

    • Créez un fichier Info.plist
    touch MyNativeAOTLibrary.framework/Info.plist
    
    • Ajouter le contenu de l’annexe dans le fichier créé Info.plist

Après la dernière étape, la structure de l’infrastructure doit ressembler à ceci :

MyNativeAOTLibrary.framework
    |_ MyNativeAOTLibrary
    |_ Info.plist

Empaqueter la bibliothèque partagée dans un framework universel MacCatalyst personnalisé

Les frameworks universels nécessitent des fichiers binaires pour la fois Arm64 et x64 l’architecture. Pour cette raison, vous devez publier des bibliothèques natives ciblant les deux RID suivants au préalable : maccatalyst-arm64 et maccatalyst-x64.

  1. Créez une structure de dossiers d’infrastructure :

    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. Ajuster les commandes de chargement :

    • LC_RPATH commande load

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

      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. Empaqueter manuellement le fichier binaire dans un fichier universel :

    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. Ajoutez un fichier de liste de propriétés à votre infrastructure :

    • Créez un fichier Info.plist
    touch MyNativeAOTLibrary.framework/Versions/A/Resources/Info.plist
    
    • Ajouter le contenu de l’annexe dans le fichier créé Info.plist

Après la dernière étape, la structure de l’infrastructure doit ressembler à ceci :

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

Consommer des frameworks personnalisés

  1. Ouvrir Xcode (dans cet exemple Xcode 16.0 est utilisé)

  2. Créer un projet App

  3. Choisissez le nom de votre application (par exemple MyiOSApp) et choisissez Objective-C comme langue source

  4. Ajouter une référence au MyNativeAOTLibrary framework

    • Sous l’onglet MyiOSApp Général des cibles, sous Frameworks, Bibliothèques et Contenu incorporé, sélectionnez + pour ajouter MyNativeAOTLibrary en tant que framework référencé
    • Dans la boîte de dialogue, choisissez Ajouter d’autres> fichiers, puis accédez à l’emplacement et MyNativeAOTLibrary.framework sélectionnez-le.
    • Une fois sélectionné, définissez Embed and Sign l’option pour l’infrastructure MyNativeAOTLibrary

    Référence sur l’ajout d’infrastructure Xcode

  5. Ajouter MyNativeAOTLibrary.framework un emplacement à la liste des chemins de recherche du framework dans l’onglet Paramètres de build

    Xcode ajouter un chemin de recherche d’infrastructure

  6. Modifier en main.m appelant la méthode aotsample_add managée exposée et en imprimant le résultat

    extern int aotsample_add(int a, int b);
    int main(int argc, char * argv[]) {
        ...
        NSLog(@"2 + 5 = %d", aotsample_add(2, 5));
        ...
    }
    
  7. Sélectionnez votre appareil iOS physique et générez/exécutez l’application

  8. Inspectez les journaux après le lancement de l’application. L’application doit imprimer : 2 + 5 = 7

Remarque

Pour MacCatalyst, utilisez les mêmes étapes à l’exception de l’étape 7, où la destination d’exécution doit être définie comme suit : Mac (Mac Catalyst).

Créer des bibliothèques statiques avec NativeAOT pour les plateformes similaires à iOS

Comme décrit dans la création d’une vue d’ensemble des bibliothèques natives, il est préférable de créer des bibliothèques partagées sur des bibliothèques statiques en raison de plusieurs limitations.

Toutefois, si vous le souhaitez, vous pouvez créer une bibliothèque statique en suivant les étapes de création d’un partage et en incluant une propriété supplémentaire dans le fichier projet :

<NativeLib>Static</NativeLib>

Une fois le projet publié, la bibliothèque MyNativeAOTLibrary.a statique est disponible à l’adresse : MyNativeAOTLibrary/bin/Release/net9.0/<rid>/publish.

Cet article ne traite pas de l’utilisation de la bibliothèque statique et de la configuration du projet consommateur.

Contenu de l’annexe 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>