Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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.csfö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.frameworkJustera inläsningskommandon:
LC_RPATHkommandot loadinstall_name_tool -rpath @executable_path @executable_path/Frameworks MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylibLC_ID_DYLIBkommandot 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/MyNativeAOTLibraryLägg till en egenskapslistfil i ramverket:
- Skapa en
Info.plistfil
touch MyNativeAOTLibrary.framework/Info.plist- Lägg till innehållet från bilagan i den skapade
Info.plistfilen
- 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/CurrentJustera inläsningskommandon:
LC_RPATHkommandot 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.dylibLC_ID_DYLIBkommandot 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/MyNativeAOTLibraryLägg till en egenskapslistfil i ramverket:
- Skapa en
Info.plistfil
touch MyNativeAOTLibrary.framework/Versions/A/Resources/Info.plist- Lägg till innehållet från bilagan i den skapade
Info.plistfilen
- 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.0används)Skapa ett nytt
AppprojektVä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
MyiOSAppMål allmänt går du till Ramverk, Bibliotek och Inbäddat innehåll och väljer + att lägga tillMyNativeAOTLibrarysom det refererade ramverket - I dialogrutan väljer du Lägg till andra ->Lägg till filer och bläddrar sedan till platsen
MyNativeAOTLibrary.frameworkför och väljer den - När du har valt det anger du
Embed and Signalternativet förMyNativeAOTLibraryramverk
- På fliken
Lägg till
MyNativeAOTLibrary.frameworkplats i listan över ramverkssökvägar på fliken Bygginställningar
Redigera
main.mgenom att anropa den exponerade hanterade metodenaotsample_addoch 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>