Skapa och använda anpassade ramverk för iOS-liknande plattformar
Från och med .NET 9 stöder intern AOT publicering av .NET-klassbibliotek som inte är beroende av iOS-arbetsbelastningar för iOS-liknande plattformar. Med det här stödet kan du skapa fristående interna bibliotek som kan användas från iOS-, Mac Catalyst- och tvOS-program.
Viktigt!
Den här metoden kommer inte med det inbyggda stödet för Objective-C-samverkan och ytterligare kodanpassningar kan krävas (till exempel argument för marshalling av referenstyper) för att uppnå samverkan.
Skapa delade bibliotek
I det här avsnittet beskrivs steg för att skapa ett enkelt .NET-klassbiblioteksprojekt med NativeAOT-stöd och skapa ett inbyggt bibliotek för iOS-liknande plattformar från det.
Ladda ned .NET 9 SDK
Skapa ett klassbiblioteksprojekt
dotnet new classlib -n "MyNativeAOTLibrary"
Lägg till följande egenskaper i projektfilen
MyNativeAOTLibrary.csproj
<PublishAot>true</PublishAot> <PublishAotUsingRuntimePack>true</PublishAotUsingRuntimePack>
Redigera källkoden
MyNativeAOTLibrary/Class1.cs
för att exponera en hanterad metod så att den kan refereras från den interna koden somaotsample_add
. Till exempel:using System.Runtime.InteropServices; namespace NaotLib; public class Class1 { [UnmanagedCallersOnly(EntryPoint = "aotsample_add")] public static int Add(int a, int b) { return a + b; } }
Publicera klassbiblioteket och rikta in dig på önskad iOS-liknande plattform genom att ange lämplig körningsidentifierare (refereras nedan som
<rid>
):dotnet publish -r <rid> MyNativeAOTLibrary/MyNativeAOTLibrary.csproj
När föregående steg har slutförts skapas ett par filer: ett delat bibliotek MyNativeAOTLibrary.dylib
och dess felsökningssymboler MyNativeAOTLibrary.dylib.dSYM
, som finns på: MyNativeAOTLibrary/bin/Release/net9.0/<rid>/publish/
.
Kommentar
För att skapa universella ramverk måste du publicera klassbiblioteket för både Arm64
och x64
arkitekturer för en viss plattform.
Det innebär att du måste upprepa steg 5 med en annan körningsidentifierare.
Du skulle till exempel publicera klassbiblioteket med både maccatalyst-arm64
och maccatalyst-x64
körningsidentifierare som en förutsättning för att paketera det delade biblioteket i ett anpassat universellt MacCatalyst-ramverk.
Skapa och använda ett anpassat ramverk
Apple inför ett krav på att delade bibliotek (.dylibs) måste paketeras i ramverk för att kunna användas från program.
I det här avsnittet beskrivs alla nödvändiga steg för att uppnå detta och ett enkelt scenario med ett iOS/MacCatalyst-program som använder ett delat NativeAOT-bibliotek/ramverk.
Kommentar
De beskrivna stegen är bara i demonstrationssyfte. De faktiska kraven kan variera beroende på det exakta användningsfallet.
Paketera det delade biblioteket i anpassat iOS-ramverk
Skapa en ramverksmapp:
mkdir MyNativeAOTLibrary.framework
Justera inläsningskommandon:
LC_RPATH
kommandot loadinstall_name_tool -rpath @executable_path @executable_path/Frameworks MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib
LC_ID_DYLIB
kommandot loadinstall_name_tool -id @rpath/MyNativeAOTLibrary.framework/MyNativeAOTLibrary MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib
Paketera binärfilen manuellt i en universell fil:
lipo -create MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib -output MyNativeAOTLibrary.framework/MyNativeAOTLibrary
Lägg till en egenskapslistfil i ramverket:
- Skapa en
Info.plist
fil
touch MyNativeAOTLibrary.framework/Info.plist
- Lägg till innehållet från bilagan i den skapade
Info.plist
filen
- Skapa en
Efter det sista steget bör ramverksstrukturen se ut så här:
MyNativeAOTLibrary.framework
|_ MyNativeAOTLibrary
|_ Info.plist
Paketera det delade biblioteket i ett anpassat universellt MacCatalyst-ramverk
Universella ramverk kräver binärfiler för både Arm64
och x64
arkitektur.
Därför måste du publicera interna bibliotek som riktar sig till båda följande RID:er i förväg: maccatalyst-arm64
och maccatalyst-x64
.
Skapa en ramverksmappstruktur:
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
Justera inläsningskommandon:
LC_RPATH
kommandot 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
kommandot 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
Paketera binärfilen manuellt i en universell fil:
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
Lägg till en egenskapslistfil i ramverket:
- Skapa en
Info.plist
fil
touch MyNativeAOTLibrary.framework/Versions/A/Resources/Info.plist
- Lägg till innehållet från bilagan i den skapade
Info.plist
filen
- Skapa en
Efter det sista steget bör ramverksstrukturen se ut så här:
MyNativeAOTLibrary.framework
|_ MyNativeAOTLibrary -> Versions/Current/MyNativeAOTLibrary
|_ Resources -> Versions/Current/Resources
|_ Versions
|_ A
| |_ Resources
| | |_ Info.plist
| |_ MyNativeAOTLibrary
|_ Current -> A
Använda anpassade ramverk
Öppna
Xcode
(i det här exempletXcode 16.0
används)Skapa ett nytt
App
projektVälj namnet på din app (till exempel
MyiOSApp
) och välj Objective-C som källspråkLägga till en referens till ramverket
MyNativeAOTLibrary
- På fliken
MyiOSApp
Mål allmänt går du till Ramverk, Bibliotek och Inbäddat innehåll och väljer + att lägga tillMyNativeAOTLibrary
som det refererade ramverket - I dialogrutan väljer du Lägg till andra ->Lägg till filer och bläddrar sedan till platsen
MyNativeAOTLibrary.framework
för och väljer den - När du har valt det anger du
Embed and Sign
alternativet förMyNativeAOTLibrary
ramverk
- På fliken
Lägg till
MyNativeAOTLibrary.framework
plats i listan över ramverkssökvägar på fliken BygginställningarRedigera
main.m
genom att anropa den exponerade hanterade metodenaotsample_add
och skriva ut resultatetextern int aotsample_add(int a, int b); int main(int argc, char * argv[]) { ... NSLog(@"2 + 5 = %d", aotsample_add(2, 5)); ... }
Välj din fysiska iOS-enhet och skapa/köra appen
Granska loggarna när appen har startats. Appen bör skriva ut:
2 + 5 = 7
Kommentar
För MacCatalyst använder du samma steg förutom steg 7, där körmålet måste anges som: Mac (Mac Catalyst)
.
Skapa statiska bibliotek med NativeAOT för iOS-liknande plattformar
Som beskrivs i översikten över att skapa inbyggda bibliotek är det bättre att skapa delade bibliotek över statiska bibliotek på grund av flera begränsningar.
Om du vill kan du dock skapa ett statiskt bibliotek genom att följa stegen för att skapa en delad och inkludera ytterligare en egenskap i projektfilen:
<NativeLib>Static</NativeLib>
När projektet har publicerats finns det statiska biblioteket MyNativeAOTLibrary.a
på: MyNativeAOTLibrary/bin/Release/net9.0/<rid>/publish
.
Den här artikeln beskriver inte hur du använder det statiska biblioteket och konfigurerar konsumentprojektet.
Bilaga Info.plist-innehåll
<?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>