Freigeben über


Erstellen und Nutzen von benutzerdefinierten Frameworks für iOS-ähnliche Plattformen

Ab .NET 9 unterstützt Native AOT das Veröffentlichen von .NET-Klassenbibliotheken, die nicht von iOS-Workloads für iOS-ähnliche Plattformen abhängen. Mit dieser Unterstützung können Sie eigenständige native Bibliotheken erstellen, die von iOS-, Mac Catalyst- und tvOS-Anwendungen genutzt werden können.

Wichtig

Dieser Ansatz enthält nicht die integrierte Objective-C-Interoperabilitätsunterstützung, und zusätzliche Codeanpassungen können erforderlich sein (z. B. Marshalling-Referenztypargumente), um interoperabilität zu erreichen.

Erstellen freigegebener Bibliotheken

In diesem Abschnitt werden die Schritte zum Erstellen eines einfachen .NET-Klassenbibliotheksprojekts mit NativeAOT-Unterstützung beschrieben und eine systemeigene Bibliothek für iOS-ähnliche Plattformen daraus erstellt.

  1. .NET 9 SDK herunterladen

  2. Erstellen eines Klassenbibliotheksprojekts

    dotnet new classlib -n "MyNativeAOTLibrary"
    
  3. Fügen Sie der Projektdatei die folgenden Eigenschaften hinzu: MyNativeAOTLibrary.csproj

    <PublishAot>true</PublishAot>
    <PublishAotUsingRuntimePack>true</PublishAotUsingRuntimePack>
    
  4. Bearbeiten Sie den MyNativeAOTLibrary/Class1.cs Quellcode, um eine verwaltete Methode verfügbar zu machen, damit sie aus dem systemeigenen Code referenziert werden kann als aotsample_add. Zum Beispiel:

    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. Veröffentlichen Sie die Klassenbibliothek und zielen Sie auf die gewünschte iOS-ähnliche Plattform ab, indem Sie den entsprechenden Laufzeitbezeichner angeben (referenziert unten wie <rid>folgt):

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

Der erfolgreiche Abschluss des vorherigen Schritts erzeugt ein Paar Dateien: eine freigegebene Bibliothek MyNativeAOTLibrary.dylib und die zugehörigen DebugsymboleMyNativeAOTLibrary.dylib.dSYM, die sich unter: befinden. MyNativeAOTLibrary/bin/Release/net9.0/<rid>/publish/

Hinweis

Zum Erstellen universeller Frameworks ist es erforderlich, die Klassenbibliothek für beide Arm64 und x64 Architekturen für eine bestimmte Plattform zu veröffentlichen. Dies bedeutet, dass Sie Schritt 5 mit einem anderen Laufzeitbezeichner wiederholen müssen. Beispielsweise veröffentlichen Sie die Klassenbibliothek mit sowohl maccatalyst-arm64 maccatalyst-x64 als auch Laufzeit-IDs als Voraussetzung für das Verpacken der freigegebenen Bibliothek in einem benutzerdefinierten universellen MacCatalyst-Framework.

Erstellen und Nutzen eines benutzerdefinierten Frameworks

Apple erzwingt eine Anforderung, dass freigegebene Bibliotheken (Dylibs) in Frameworks verpackt werden müssen, um von Anwendungen genutzt werden zu können.

In diesem Abschnitt werden alle erforderlichen Schritte beschrieben, um dies und ein einfaches Szenario einer iOS/MacCatalyst-Anwendung zu erreichen, die eine gemeinsam genutzte NativeAOT-Bibliothek/-Framework verwendet.

Hinweis

Die beschriebenen Schritte dienen lediglich zu Demonstrationszwecken. Die tatsächlichen Anforderungen können je nach genauem Anwendungsfall variieren.

Packen der freigegebenen Bibliothek in benutzerdefiniertes iOS-Framework

  1. Erstellen eines Frameworkordners:

    mkdir MyNativeAOTLibrary.framework
    
  2. Anpassen von Ladebefehlen:

    • LC_RPATH Befehl laden

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

      install_name_tool -id @rpath/MyNativeAOTLibrary.framework/MyNativeAOTLibrary MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib
      
  3. Packen Sie die Binärdatei manuell in eine universelle Datei:

    lipo -create MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib -output MyNativeAOTLibrary.framework/MyNativeAOTLibrary
    
  4. Fügen Sie Ihrem Framework eine Eigenschaftenlistendatei hinzu:

    • Erstellen der Datei Info.plist
    touch MyNativeAOTLibrary.framework/Info.plist
    
    • Fügen Sie den Inhalt aus dem Anhang zur erstellten Info.plist Datei hinzu.

Nach dem letzten Schritt sollte die Frameworkstruktur wie folgt aussehen:

MyNativeAOTLibrary.framework
    |_ MyNativeAOTLibrary
    |_ Info.plist

Verpacken der freigegebenen Bibliothek in ein benutzerdefiniertes universelles MacCatalyst-Framework

Universelle Frameworks erfordern Binärdateien sowohl für die Architektur als auch Arm64 x64 für die Architektur. Aus diesem Grund müssen Sie systemeigene Bibliotheken für die folgenden RIDs vorab veröffentlichen: maccatalyst-arm64 und maccatalyst-x64.

  1. Erstellen einer Frameworkordnerstruktur:

    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. Anpassen von Ladebefehlen:

    • LC_RPATH Befehl laden

      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 Befehl laden

      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. Packen Sie die Binärdatei manuell in eine universelle Datei:

    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. Fügen Sie Ihrem Framework eine Eigenschaftenlistendatei hinzu:

    • Erstellen der Datei Info.plist
    touch MyNativeAOTLibrary.framework/Versions/A/Resources/Info.plist
    
    • Fügen Sie den Inhalt aus dem Anhang zur erstellten Info.plist Datei hinzu.

Nach dem letzten Schritt sollte die Frameworkstruktur wie folgt aussehen:

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

Nutzen von benutzerdefinierten Frameworks

  1. Öffnen Xcode (in diesem Beispiel Xcode 16.0 wird verwendet)

  2. Erstellen eines neuen App-Projekts

  3. Wählen Sie den Namen für Ihre App (z. B MyiOSApp. ) und dann "Objective-C" als Quellsprache aus.

  4. Hinzufügen eines Verweises auf das MyNativeAOTLibrary Framework

    • Wählen Sie auf der MyiOSApp Registerkarte "Allgemein" unter "Frameworks", "Bibliotheken" und "Eingebetteter Inhalt" die Option aus+, die als referenziertes Framework hinzugefügt werden MyNativeAOTLibrary soll.
    • Wählen Sie im Dialogfeld "Weitere> Dateien hinzufügen" aus, und navigieren Sie dann zum Speicherort, MyNativeAOTLibrary.framework und wählen Sie ihn aus.
    • Nachdem diese Option ausgewählt wurde, legen Sie die Option für MyNativeAOTLibrary das Framework festEmbed and Sign.

    Xcode-Frameworkreferenz hinzufügen

  5. Hinzufügen MyNativeAOTLibrary.framework von Speicherort zur Liste der Framework-Suchpfade auf der Registerkarte "Buildeinstellungen "

    Xcode-Add-Framework-Suchpfad

  6. Bearbeiten durch main.m Aufrufen der verfügbar gemachten verwalteten Methode aotsample_add und Drucken des Ergebnisses

    extern int aotsample_add(int a, int b);
    int main(int argc, char * argv[]) {
        ...
        NSLog(@"2 + 5 = %d", aotsample_add(2, 5));
        ...
    }
    
  7. Wählen Sie Ihr physisches iOS-Gerät aus, und erstellen/ausführen Sie die App.

  8. Überprüfen Sie die Protokolle, nachdem die App erfolgreich gestartet wurde. Die App sollte gedruckt werden: 2 + 5 = 7

Hinweis

Verwenden Sie für MacCatalyst die gleichen Schritte mit Ausnahme von Schritt 7, wobei das Ziel "Ausführen" wie folgt festgelegt werden muss: Mac (Mac Catalyst)

Erstellen statischer Bibliotheken mit NativeAOT für iOS-ähnliche Plattformen

Wie in der Übersicht über systemeigene Bibliotheken beschrieben, ist es besser, freigegebene Bibliotheken aufgrund verschiedener Einschränkungen über statische Bibliotheken zu erstellen.

Bei Bedarf können Sie jedoch eine statische Bibliothek erstellen, indem Sie die Schritte zum Erstellen einer freigegebenen Bibliothek ausführen und eine zusätzliche Eigenschaft in der Projektdatei einschließen:

<NativeLib>Static</NativeLib>

Nachdem das Projekt veröffentlicht wurde, finden Sie die statische Bibliothek MyNativeAOTLibrary.a unter: MyNativeAOTLibrary/bin/Release/net9.0/<rid>/publish.

In diesem Artikel wird nicht erläutert, wie Die statische Bibliothek verwendet und das Consumerprojekt konfiguriert wird.

Anhang Info.plist Inhalt

<?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>