Vytváření a využívání vlastních architektur pro platformy podobné iOSu
Od .NET 9 podporuje nativní AOT publikování knihoven tříd .NET, které nezávisí na úlohách iOSu pro platformy podobné iOSu. Tato podpora umožňuje vytvářet samostatné nativní knihovny, které lze využívat z aplikací pro iOS, Mac Catalyst a tvOS.
Důležité
Tento přístup nepřichází s integrovanou podporou interoperability Objective-C a k dosažení interoperability mohou být vyžadovány další úpravy kódu (například sřazování argumentů typu odkazu).
Vytváření sdílených knihoven
Tato část popisuje postup vytvoření jednoduchého projektu knihovny tříd .NET s podporou NativeAOT a vytvoření nativní knihovny pro platformy podobné iOSu.
Stažení sady .NET 9 SDK
Vytvoření projektu knihovny tříd
dotnet new classlib -n "MyNativeAOTLibrary"
Do souboru projektu přidejte následující vlastnosti.
MyNativeAOTLibrary.csproj
<PublishAot>true</PublishAot> <PublishAotUsingRuntimePack>true</PublishAotUsingRuntimePack>
MyNativeAOTLibrary/Class1.cs
Upravte zdrojový kód tak, aby zpřístupnil spravovanou metodu, aby na ni bylo možné odkazovat z nativního kódu jakoaotsample_add
. Příklad:using System.Runtime.InteropServices; namespace NaotLib; public class Class1 { [UnmanagedCallersOnly(EntryPoint = "aotsample_add")] public static int Add(int a, int b) { return a + b; } }
Publikujte knihovnu tříd a cílte na požadovanou platformu typu iOS zadáním příslušného identifikátoru modulu runtime (na který odkazujeme níže
<rid>
):dotnet publish -r <rid> MyNativeAOTLibrary/MyNativeAOTLibrary.csproj
Úspěšné dokončení předchozího kroku vytvoří dvojici souborů: sdílenou knihovnu MyNativeAOTLibrary.dylib
a její symboly MyNativeAOTLibrary.dylib.dSYM
ladění , které jsou umístěny v: MyNativeAOTLibrary/bin/Release/net9.0/<rid>/publish/
.
Poznámka:
Pro vytváření univerzálních architektur je nutné publikovat knihovnu tříd pro Arm64
danou platformu i x64
architekturu.
To znamená, že potřebujete opakovat krok 5 s jiným identifikátorem modulu runtime.
Knihovnu tříd byste například publikovali s maccatalyst-arm64
identifikátory runtime i maccatalyst-x64
identifikátory modulu runtime jako předpoklad pro zabalení sdílené knihovny do vlastní univerzální architektury MacCatalyst.
Vytvoření a využití vlastní architektury
Apple vyžaduje, aby sdílené knihovny (.dylibs) bylo potřeba zabalit do architektur, aby je bylo možné využívat z aplikací.
Tato část popisuje všechny požadované kroky k dosažení tohoto problému a jednoduchý scénář aplikace iOS/MacCatalyst, která využívá sdílenou knihovnu nebo architekturu NativeAOT.
Poznámka:
Popsané kroky jsou určené jenom pro demonstrační účely. Skutečné požadavky se můžou lišit v závislosti na přesném případu použití.
Zabalení sdílené knihovny do vlastní architektury iOS
Vytvořte složku architektury:
mkdir MyNativeAOTLibrary.framework
Upravit příkazy pro načtení:
LC_RPATH
load commandinstall_name_tool -rpath @executable_path @executable_path/Frameworks MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib
LC_ID_DYLIB
load commandinstall_name_tool -id @rpath/MyNativeAOTLibrary.framework/MyNativeAOTLibrary MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib
Ručně zabalte binární soubor do univerzálního souboru:
lipo -create MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib -output MyNativeAOTLibrary.framework/MyNativeAOTLibrary
Přidejte soubor seznamu vlastností do architektury:
- Vytvoření
Info.plist
souboru
touch MyNativeAOTLibrary.framework/Info.plist
- Přidání obsahu z dodatku do vytvořeného souboru
Info.plist
- Vytvoření
Po posledním kroku by struktura architektury měla vypadat takto:
MyNativeAOTLibrary.framework
|_ MyNativeAOTLibrary
|_ Info.plist
Zabalení sdílené knihovny do vlastní univerzální architektury MacCatalyst
Univerzální architektury vyžadují binární soubory jak pro architekturu, tak Arm64
x64
pro architekturu.
Z tohoto důvodu musíte předem publikovat nativní knihovny, které cílí na obě následující identifikátory RID: maccatalyst-arm64
a maccatalyst-x64
.
Vytvoření struktury složek architektury:
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
Upravit příkazy pro načtení:
LC_RPATH
load commandinstall_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
load commandinstall_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
Ručně zabalte binární soubor do univerzálního souboru:
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
Přidejte soubor seznamu vlastností do architektury:
- Vytvoření
Info.plist
souboru
touch MyNativeAOTLibrary.framework/Versions/A/Resources/Info.plist
- Přidání obsahu z dodatku do vytvořeného souboru
Info.plist
- Vytvoření
Po posledním kroku by struktura architektury měla vypadat takto:
MyNativeAOTLibrary.framework
|_ MyNativeAOTLibrary -> Versions/Current/MyNativeAOTLibrary
|_ Resources -> Versions/Current/Resources
|_ Versions
|_ A
| |_ Resources
| | |_ Info.plist
| |_ MyNativeAOTLibrary
|_ Current -> A
Využívání vlastních architektur
Otevřít
Xcode
(v tomto příkladuXcode 16.0
se používá)Vytvoření nového
App
projektuZvolte název aplikace (například
MyiOSApp
) a jako zdrojový jazyk zvolte Objective-C.Přidání odkazu na architekturu
MyNativeAOTLibrary
MyiOSApp
Na kartě Cíle Obecné v části Architektury, Knihovny a Vložený obsah vyberte + přidatMyNativeAOTLibrary
jako odkazovanou architekturu.- V dialogovém okně zvolte Přidat další ->Přidat soubory a pak přejděte do umístění a vyberte ho
MyNativeAOTLibrary.framework
. - Po výběru nastavte
Embed and Sign
možnost proMyNativeAOTLibrary
architekturu.
Přidání
MyNativeAOTLibrary.framework
umístění do seznamu cest hledání rozhraní na kartě Nastavení sestaveníUpravit
main.m
zavoláním vystavené spravované metodyaotsample_add
a tiskem výsledkuextern int aotsample_add(int a, int b); int main(int argc, char * argv[]) { ... NSLog(@"2 + 5 = %d", aotsample_add(2, 5)); ... }
Vyberte fyzické zařízení s iOSem a sestavte nebo spusťte aplikaci.
Zkontrolujte protokoly po úspěšném spuštění aplikace. Aplikace by se měla vytisknout:
2 + 5 = 7
Poznámka:
Pro MacCatalyst použijte stejný postup s výjimkou kroku 7, kde musí být cíl spuštění nastaven jako: Mac (Mac Catalyst)
.
Vytváření statických knihoven pomocí NativeAOT pro platformy podobné iOSu
Jak je popsáno v přehledu vytváření nativních knihoven, je lepší vytvářet sdílené knihovny nad statickými knihovnami kvůli několika omezením.
V případě potřeby ale můžete statickou knihovnu vytvořit pomocí kroků pro sestavení sdíleného knihovny a zahrnout do souboru projektu další vlastnost:
<NativeLib>Static</NativeLib>
Po publikování projektu lze statickou knihovnu MyNativeAOTLibrary.a
najít na adrese: MyNativeAOTLibrary/bin/Release/net9.0/<rid>/publish
.
Tento článek se nezabývá tím, jak využívat statickou knihovnu a nakonfigurovat projekt příjemce.
Obsah přílohy Info.plist
<?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>