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.
.NET 9 SDK herunterladen
Erstellen eines Klassenbibliotheksprojekts
dotnet new classlib -n "MyNativeAOTLibrary"
Fügen Sie der Projektdatei die folgenden Eigenschaften hinzu:
MyNativeAOTLibrary.csproj
<PublishAot>true</PublishAot> <PublishAotUsingRuntimePack>true</PublishAotUsingRuntimePack>
Bearbeiten Sie den
MyNativeAOTLibrary/Class1.cs
Quellcode, um eine verwaltete Methode verfügbar zu machen, damit sie aus dem systemeigenen Code referenziert werden kann alsaotsample_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; } }
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
Erstellen eines Frameworkordners:
mkdir MyNativeAOTLibrary.framework
Anpassen von Ladebefehlen:
LC_RPATH
Befehl ladeninstall_name_tool -rpath @executable_path @executable_path/Frameworks MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib
LC_ID_DYLIB
Befehl ladeninstall_name_tool -id @rpath/MyNativeAOTLibrary.framework/MyNativeAOTLibrary MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib
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
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.
- Erstellen der Datei
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
.
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
Anpassen von Ladebefehlen:
LC_RPATH
Befehl 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
Befehl 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
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
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.
- Erstellen der Datei
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
Öffnen
Xcode
(in diesem BeispielXcode 16.0
wird verwendet)Erstellen eines neuen
App
-ProjektsWählen Sie den Namen für Ihre App (z. B
MyiOSApp
. ) und dann "Objective-C" als Quellsprache aus.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 werdenMyNativeAOTLibrary
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
.
- Wählen Sie auf der
Hinzufügen
MyNativeAOTLibrary.framework
von Speicherort zur Liste der Framework-Suchpfade auf der Registerkarte "Buildeinstellungen "Bearbeiten durch
main.m
Aufrufen der verfügbar gemachten verwalteten Methodeaotsample_add
und Drucken des Ergebnissesextern int aotsample_add(int a, int b); int main(int argc, char * argv[]) { ... NSLog(@"2 + 5 = %d", aotsample_add(2, 5)); ... }
Wählen Sie Ihr physisches iOS-Gerät aus, und erstellen/ausführen Sie die App.
Ü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>