Creare e usare framework personalizzati per piattaforme simili a iOS
A partire da .NET 9, Native AOT supporta la pubblicazione di librerie di classi .NET che non dipendono dai carichi di lavoro iOS per piattaforme simili a iOS. Questo supporto consente di creare librerie native autonome che possono essere usate da applicazioni iOS, Mac Catalyst e tvOS.
Importante
Questo approccio non include il supporto predefinito dell'interoperabilità Objective-C e potrebbe essere necessario adattare codice aggiuntivo (ad esempio, gli argomenti del tipo di riferimento di marshalling) per ottenere l'interoperabilità.
Creare librerie condivise
Questa sezione descrive i passaggi per creare un semplice progetto libreria di classi .NET con supporto NativeAOT e produrre una libreria nativa per piattaforme simili a iOS da essa.
Scaricare .NET 9 SDK
Creare un progetto di libreria di classi
dotnet new classlib -n "MyNativeAOTLibrary"
Aggiungere le proprietà seguenti nel file di progetto
MyNativeAOTLibrary.csproj
<PublishAot>true</PublishAot> <PublishAotUsingRuntimePack>true</PublishAotUsingRuntimePack>
Modificare il
MyNativeAOTLibrary/Class1.cs
codice sorgente per esporre un metodo gestito in modo che possa essere fatto riferimento dal codice nativo comeaotsample_add
. Ad esempio:using System.Runtime.InteropServices; namespace NaotLib; public class Class1 { [UnmanagedCallersOnly(EntryPoint = "aotsample_add")] public static int Add(int a, int b) { return a + b; } }
Pubblicare la libreria di classi e specificare come destinazione la piattaforma iOS desiderata specificando l'identificatore di runtime appropriato (indicato di seguito come
<rid>
):dotnet publish -r <rid> MyNativeAOTLibrary/MyNativeAOTLibrary.csproj
Il completamento corretto del passaggio precedente produce una coppia di file: una libreria MyNativeAOTLibrary.dylib
condivisa e i MyNativeAOTLibrary.dylib.dSYM
relativi simboli di debug, che si trovano in: MyNativeAOTLibrary/bin/Release/net9.0/<rid>/publish/
.
Nota
Per creare framework universali, è necessario pubblicare la libreria di classi per entrambe Arm64
le architetture e x64
per una determinata piattaforma.
Ciò significa che è necessario ripetere il passaggio 5 con un identificatore di runtime diverso.
Ad esempio, si pubblica la libreria di classi con identificatori di runtime e maccatalyst-arm64
maccatalyst-x64
come prerequisito per la creazione di pacchetti della libreria condivisa in un framework universale MacCatalyst personalizzato.
Creare e usare un framework personalizzato
Apple impone un requisito che le librerie condivise (con estensione dylibs) debbano essere inserite in pacchetti in framework per poter essere utilizzate dalle applicazioni.
Questa sezione descrive tutti i passaggi necessari per ottenere questo risultato e uno scenario semplice di un'applicazione iOS/MacCatalyst che usa una libreria/framework NativeAOT condiviso.
Nota
I passaggi descritti sono solo a scopo dimostrativo. I requisiti effettivi possono variare a seconda del caso d'uso esatto.
Creare un pacchetto della libreria condivisa in un framework iOS personalizzato
Creare una cartella del framework:
mkdir MyNativeAOTLibrary.framework
Modificare i comandi di caricamento:
LC_RPATH
comando loadinstall_name_tool -rpath @executable_path @executable_path/Frameworks MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib
LC_ID_DYLIB
comando loadinstall_name_tool -id @rpath/MyNativeAOTLibrary.framework/MyNativeAOTLibrary MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib
Creare manualmente il pacchetto binario in un file universale:
lipo -create MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib -output MyNativeAOTLibrary.framework/MyNativeAOTLibrary
Aggiungere un file dell'elenco di proprietà al framework:
- Creare un file
Info.plist
touch MyNativeAOTLibrary.framework/Info.plist
- Creare un file
Dopo il passaggio finale, la struttura del framework dovrebbe essere simile alla seguente:
MyNativeAOTLibrary.framework
|_ MyNativeAOTLibrary
|_ Info.plist
Creare un pacchetto della libreria condivisa in un framework universale MacCatalyst personalizzato
I framework universali richiedono file binari sia per l'architettura Arm64
x64
che per l'architettura.
Per questo motivo, è necessario pubblicare librerie native destinate a entrambi i rid seguenti in anticipo: maccatalyst-arm64
e maccatalyst-x64
.
Creare una struttura di cartelle del framework:
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
Modificare i comandi di caricamento:
LC_RPATH
comando 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
comando 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
Creare manualmente il pacchetto binario in un file universale:
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
Aggiungere un file dell'elenco di proprietà al framework:
- Creare un file
Info.plist
touch MyNativeAOTLibrary.framework/Versions/A/Resources/Info.plist
- Creare un file
Dopo il passaggio finale, la struttura del framework dovrebbe essere simile alla seguente:
MyNativeAOTLibrary.framework
|_ MyNativeAOTLibrary -> Versions/Current/MyNativeAOTLibrary
|_ Resources -> Versions/Current/Resources
|_ Versions
|_ A
| |_ Resources
| | |_ Info.plist
| |_ MyNativeAOTLibrary
|_ Current -> A
Utilizzare framework personalizzati
Apri
Xcode
(in questo esempioXcode 16.0
viene usato)Creare un nuovo
App
progettoScegliere il nome dell'app (ad esempio,
MyiOSApp
) e scegliere Objective-C come linguaggio di origineAggiungere un riferimento al
MyNativeAOTLibrary
frameworkMyiOSApp
Nella scheda Generale delle destinazioni, in Framework, librerie e contenuto incorporato, selezionare + per aggiungereMyNativeAOTLibrary
come framework di riferimento- Nella finestra di dialogo scegliere Aggiungi altri ->Aggiungi file e quindi passare al percorso di
MyNativeAOTLibrary.framework
e selezionarlo - Dopo aver selezionato, impostare
Embed and Sign
l'opzione perMyNativeAOTLibrary
il framework
Aggiungere
MyNativeAOTLibrary.framework
il percorso all'elenco dei percorsi di ricerca framework nella scheda Impostazioni di compilazioneModificare
main.m
chiamando il metodoaotsample_add
gestito esposto e stampando il risultatoextern int aotsample_add(int a, int b); int main(int argc, char * argv[]) { ... NSLog(@"2 + 5 = %d", aotsample_add(2, 5)); ... }
Selezionare il dispositivo iOS fisico ed eseguire l'app
Esaminare i log dopo l'avvio dell'app. L'app deve stampare:
2 + 5 = 7
Nota
Per MacCatalyst, usare gli stessi passaggi, ad eccezione del passaggio 7, in cui la destinazione di esecuzione deve essere impostata come : Mac (Mac Catalyst)
.
Creare librerie statiche con NativeAOT per piattaforme simili a iOS
Come descritto in Panoramica della creazione di librerie native, è preferibile creare librerie condivise rispetto a quelle statiche a causa di diverse limitazioni.
Tuttavia, se lo si desidera, è possibile compilare una libreria statica seguendo i passaggi per la compilazione di uno condiviso e includendo una proprietà aggiuntiva nel file di progetto:
<NativeLib>Static</NativeLib>
Dopo la pubblicazione del progetto, la libreria MyNativeAOTLibrary.a
statica è disponibile in: MyNativeAOTLibrary/bin/Release/net9.0/<rid>/publish
.
Questo articolo non illustra come usare la libreria statica e configurare il progetto consumer.
Contenuto di Appendice 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>