Dela via


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.

  1. Ladda ned .NET 9 SDK

  2. Skapa ett klassbiblioteksprojekt

    dotnet new classlib -n "MyNativeAOTLibrary"
    
  3. Lägg till följande egenskaper i projektfilen MyNativeAOTLibrary.csproj

    <PublishAot>true</PublishAot>
    <PublishAotUsingRuntimePack>true</PublishAotUsingRuntimePack>
    
  4. Redigera källkoden MyNativeAOTLibrary/Class1.cs för att exponera en hanterad metod så att den kan refereras från den interna koden som aotsample_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;
        }
    }
    
  5. 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

  1. Skapa en ramverksmapp:

    mkdir MyNativeAOTLibrary.framework
    
  2. Justera inläsningskommandon:

    • LC_RPATH kommandot load

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

      install_name_tool -id @rpath/MyNativeAOTLibrary.framework/MyNativeAOTLibrary MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib
      
  3. Paketera binärfilen manuellt i en universell fil:

    lipo -create MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib -output MyNativeAOTLibrary.framework/MyNativeAOTLibrary
    
  4. 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

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.

  1. 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
    
  2. Justera inläsningskommandon:

    • LC_RPATH kommandot 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 kommandot 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. 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
    
  4. 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

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

  1. Öppna Xcode (i det här exemplet Xcode 16.0 används)

  2. Skapa ett nytt App projekt

  3. Välj namnet på din app (till exempel MyiOSApp) och välj Objective-C som källspråk

  4. Lä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 till MyNativeAOTLibrary 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ör MyNativeAOTLibrary ramverk

    Xcode lägg till ramverksreferens

  5. Lägg till MyNativeAOTLibrary.framework plats i listan över ramverkssökvägarfliken Bygginställningar

    Sökväg för Xcode-tillägg av ramverkssökning

  6. Redigera main.m genom att anropa den exponerade hanterade metoden aotsample_add och skriva ut resultatet

    extern int aotsample_add(int a, int b);
    int main(int argc, char * argv[]) {
        ...
        NSLog(@"2 + 5 = %d", aotsample_add(2, 5));
        ...
    }
    
  7. Välj din fysiska iOS-enhet och skapa/köra appen

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