Condividi tramite


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.

  1. Scaricare .NET 9 SDK

  2. Creare un progetto di libreria di classi

    dotnet new classlib -n "MyNativeAOTLibrary"
    
  3. Aggiungere le proprietà seguenti nel file di progetto MyNativeAOTLibrary.csproj

    <PublishAot>true</PublishAot>
    <PublishAotUsingRuntimePack>true</PublishAotUsingRuntimePack>
    
  4. Modificare il MyNativeAOTLibrary/Class1.cs codice sorgente per esporre un metodo gestito in modo che possa essere fatto riferimento dal codice nativo come aotsample_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;
        }
    }
    
  5. 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.dSYMrelativi 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

  1. Creare una cartella del framework:

    mkdir MyNativeAOTLibrary.framework
    
  2. Modificare i comandi di caricamento:

    • LC_RPATH comando load

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

      install_name_tool -id @rpath/MyNativeAOTLibrary.framework/MyNativeAOTLibrary MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib
      
  3. 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
    
  4. Aggiungere un file dell'elenco di proprietà al framework:

    • Creare un file Info.plist
    touch MyNativeAOTLibrary.framework/Info.plist
    
    • Aggiungere il contenuto dall'appendice al file creato Info.plist

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.

  1. 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
    
  2. Modificare i comandi di caricamento:

    • LC_RPATH comando 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 comando 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. 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
    
  4. Aggiungere un file dell'elenco di proprietà al framework:

    • Creare un file Info.plist
    touch MyNativeAOTLibrary.framework/Versions/A/Resources/Info.plist
    
    • Aggiungere il contenuto dall'appendice al file creato Info.plist

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

  1. Apri Xcode (in questo esempio Xcode 16.0 viene usato)

  2. Creare un nuovo App progetto

  3. Scegliere il nome dell'app (ad esempio, MyiOSApp) e scegliere Objective-C come linguaggio di origine

  4. Aggiungere un riferimento al MyNativeAOTLibrary framework

    • MyiOSApp Nella scheda Generale delle destinazioni, in Framework, librerie e contenuto incorporato, selezionare + per aggiungere MyNativeAOTLibrary 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 per MyNativeAOTLibrary il framework

    Informazioni di riferimento su Xcode add framework

  5. Aggiungere MyNativeAOTLibrary.framework il percorso all'elenco dei percorsi di ricerca framework nella scheda Impostazioni di compilazione

    Xcode aggiungere il percorso di ricerca del framework

  6. Modificare main.m chiamando il metodo aotsample_add gestito esposto e stampando il risultato

    extern int aotsample_add(int a, int b);
    int main(int argc, char * argv[]) {
        ...
        NSLog(@"2 + 5 = %d", aotsample_add(2, 5));
        ...
    }
    
  7. Selezionare il dispositivo iOS fisico ed eseguire l'app

  8. 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>