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.
Télécharger le Kit de développement logiciel (SDK) .NET 9
Créer un projet de bibliothèque de classes
dotnet new classlib -n "MyNativeAOTLibrary"
Ajoutez les propriétés suivantes dans le fichier projet
MyNativeAOTLibrary.csproj
<PublishAot>true</PublishAot> <PublishAotUsingRuntimePack>true</PublishAotUsingRuntimePack>
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 queaotsample_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; } }
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.dSYM
de 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
Créez un dossier d’infrastructure :
mkdir MyNativeAOTLibrary.framework
Ajuster les commandes de chargement :
LC_RPATH
commande loadinstall_name_tool -rpath @executable_path @executable_path/Frameworks MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib
LC_ID_DYLIB
commande loadinstall_name_tool -id @rpath/MyNativeAOTLibrary.framework/MyNativeAOTLibrary MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib
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
Ajoutez un fichier de liste de propriétés à votre infrastructure :
- Créez un fichier
Info.plist
touch MyNativeAOTLibrary.framework/Info.plist
- Créez un fichier
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
.
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
Ajuster les commandes de chargement :
LC_RPATH
commande loadinstall_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 loadinstall_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
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
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
- Créez un fichier
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
Ouvrir
Xcode
(dans cet exempleXcode 16.0
est utilisé)Créer un projet
App
Choisissez le nom de votre application (par exemple
MyiOSApp
) et choisissez Objective-C comme langue sourceAjouter 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 ajouterMyNativeAOTLibrary
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’infrastructureMyNativeAOTLibrary
- Sous l’onglet
Ajouter
MyNativeAOTLibrary.framework
un emplacement à la liste des chemins de recherche du framework dans l’onglet Paramètres de buildModifier en
main.m
appelant la méthodeaotsample_add
managée exposée et en imprimant le résultatextern int aotsample_add(int a, int b); int main(int argc, char * argv[]) { ... NSLog(@"2 + 5 = %d", aotsample_add(2, 5)); ... }
Sélectionnez votre appareil iOS physique et générez/exécutez l’application
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>