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.
.NET 9 SDK downloaden
Een klassebibliotheekproject maken
dotnet new classlib -n "MyNativeAOTLibrary"
Voeg de volgende eigenschappen toe aan het projectbestand
MyNativeAOTLibrary.csproj
<PublishAot>true</PublishAot> <PublishAotUsingRuntimePack>true</PublishAotUsingRuntimePack>
Bewerk de
MyNativeAOTLibrary/Class1.cs
broncode om een beheerde methode beschikbaar te maken, zodat er vanuit de systeemeigen code naar kan worden verwezen alsaotsample_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; } }
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
Een frameworkmap maken:
mkdir MyNativeAOTLibrary.framework
Laadopdrachten aanpassen:
LC_RPATH
opdracht ladeninstall_name_tool -rpath @executable_path @executable_path/Frameworks MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib
LC_ID_DYLIB
opdracht ladeninstall_name_tool -id @rpath/MyNativeAOTLibrary.framework/MyNativeAOTLibrary MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib
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
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
.
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
Laadopdrachten aanpassen:
LC_RPATH
opdracht ladeninstall_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 ladeninstall_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
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
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
Openen
Xcode
(in dit voorbeeldXcode 16.0
wordt gebruikt)Een nieuw
App
project makenKies de naam voor uw app (bijvoorbeeld
MyiOSApp
) en kies Objective-C als brontaalEen 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 verwezenMyiOSApp
- 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 voorMyNativeAOTLibrary
framework in
- Selecteer op het tabblad Algemeen onder Frameworks, Bibliotheken en Ingesloten inhoud de optie + om toe te voegen
Locatie toevoegen
MyNativeAOTLibrary.framework
aan de lijst met frameworkzoekpaden op het tabblad Build SettingsBewerken
main.m
door de weergegeven beheerde methodeaotsample_add
aan te roepen en het resultaat af te drukkenextern int aotsample_add(int a, int b); int main(int argc, char * argv[]) { ... NSLog(@"2 + 5 = %d", aotsample_add(2, 5)); ... }
Selecteer uw fysieke iOS-apparaat en bouw/voer de app uit
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>