Tworzenie i używanie struktur niestandardowych dla platform podobnych do systemu iOS
Począwszy od platformy .NET 9, natywna funkcja AOT obsługuje publikowanie bibliotek klas platformy .NET, które nie zależą od obciążeń systemu iOS dla platform podobnych do systemu iOS. Ta obsługa umożliwia tworzenie autonomicznych bibliotek natywnych, które mogą być używane z aplikacji systemu iOS, Mac Catalyst i tvOS.
Ważne
Takie podejście nie jest wyposażone w wbudowaną obsługę współdziałania języka Objective-C, a w celu osiągnięcia współdziałania mogą być wymagane dodatkowe dostosowania kodu (takie jak argumenty typu odwołania do marshalingu).
Tworzenie bibliotek udostępnionych
W tej sekcji opisano kroki tworzenia prostego projektu biblioteki klas platformy .NET z obsługą nativeAOT i tworzenia natywnej biblioteki dla platform podobnych do systemu iOS.
Pobierz zestaw SDK platformy .NET 9
Tworzenie projektu biblioteki klas
dotnet new classlib -n "MyNativeAOTLibrary"
Dodaj następujące właściwości do pliku projektu
MyNativeAOTLibrary.csproj
<PublishAot>true</PublishAot> <PublishAotUsingRuntimePack>true</PublishAotUsingRuntimePack>
Edytuj kod źródłowy,
MyNativeAOTLibrary/Class1.cs
aby uwidocznić metodę zarządzaną, aby można było odwoływać się do niej z kodu natywnego jakoaotsample_add
. Na przykład:using System.Runtime.InteropServices; namespace NaotLib; public class Class1 { [UnmanagedCallersOnly(EntryPoint = "aotsample_add")] public static int Add(int a, int b) { return a + b; } }
Opublikuj bibliotekę klas i określ odpowiednią platformę podobną do systemu iOS, określając odpowiedni identyfikator środowiska uruchomieniowego (przywoływalny poniżej jako
<rid>
):dotnet publish -r <rid> MyNativeAOTLibrary/MyNativeAOTLibrary.csproj
Pomyślne ukończenie poprzedniego kroku powoduje utworzenie pary plików: udostępnionej biblioteki MyNativeAOTLibrary.dylib
i jej symboli MyNativeAOTLibrary.dylib.dSYM
debugowania , które znajdują się w lokalizacji : MyNativeAOTLibrary/bin/Release/net9.0/<rid>/publish/
.
Uwaga
W przypadku tworzenia platform uniwersalnych należy opublikować bibliotekę klas zarówno dla danej platformy, jak Arm64
i x64
dla danej platformy.
Oznacza to, że należy powtórzyć krok 5 z innym identyfikatorem środowiska uruchomieniowego.
Na przykład należy opublikować bibliotekę klas z identyfikatorami i maccatalyst-arm64
maccatalyst-x64
identyfikatorami środowiska uruchomieniowego jako wymagania wstępne dotyczące tworzenia pakietów bibliotek udostępnionych w niestandardowej platformie uniwersalnej MacCatalyst.
Tworzenie i używanie struktury niestandardowej
Firma Apple nakłada wymóg, aby udostępnione biblioteki (dylibs) musiały zostać spakowane w struktury, aby można je było używać z aplikacji.
W tej sekcji opisano wszystkie wymagane kroki, aby to osiągnąć, oraz prosty scenariusz aplikacji dla systemu iOS/MacCatalyst korzystającej z udostępnionej biblioteki/struktury NativeAOT.
Uwaga
Opisane kroki są przeznaczone tylko do celów demonstracyjnych. Rzeczywiste wymagania mogą się różnić w zależności od dokładnego przypadku użycia.
Spakuj bibliotekę udostępnioną do niestandardowej struktury systemu iOS
Utwórz folder struktury:
mkdir MyNativeAOTLibrary.framework
Dostosuj polecenia ładowania:
LC_RPATH
load , polecenieinstall_name_tool -rpath @executable_path @executable_path/Frameworks MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib
LC_ID_DYLIB
load , polecenieinstall_name_tool -id @rpath/MyNativeAOTLibrary.framework/MyNativeAOTLibrary MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib
Ręcznie spakuj plik binarny do pliku uniwersalnego:
lipo -create MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib -output MyNativeAOTLibrary.framework/MyNativeAOTLibrary
Dodaj plik listy właściwości do struktury:
- Tworzenie
Info.plist
pliku
touch MyNativeAOTLibrary.framework/Info.plist
- Tworzenie
Po ostatnim kroku struktura struktury powinna wyglądać następująco:
MyNativeAOTLibrary.framework
|_ MyNativeAOTLibrary
|_ Info.plist
Spakuj bibliotekę udostępnioną w niestandardową platformę uniwersalną MacCatalyst
Platformy uniwersalne wymagają plików binarnych zarówno dla architektury, jak Arm64
i x64
.
Z tego powodu należy wcześniej opublikować biblioteki natywne przeznaczone dla obu następujących identyfikatorów ID: maccatalyst-arm64
i maccatalyst-x64
.
Utwórz strukturę folderów struktury:
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
Dostosuj polecenia ładowania:
LC_RPATH
load , polecenieinstall_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 , polecenieinstall_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
Ręcznie spakuj plik binarny do pliku uniwersalnego:
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
Dodaj plik listy właściwości do struktury:
- Tworzenie
Info.plist
pliku
touch MyNativeAOTLibrary.framework/Versions/A/Resources/Info.plist
- Tworzenie
Po ostatnim kroku struktura struktury powinna wyglądać następująco:
MyNativeAOTLibrary.framework
|_ MyNativeAOTLibrary -> Versions/Current/MyNativeAOTLibrary
|_ Resources -> Versions/Current/Resources
|_ Versions
|_ A
| |_ Resources
| | |_ Info.plist
| |_ MyNativeAOTLibrary
|_ Current -> A
Korzystanie z platform niestandardowych
Otwórz
Xcode
(w tym przykładzieXcode 16.0
użyto)Tworzenie nowego
App
projektuWybierz nazwę aplikacji (na przykład
MyiOSApp
) i wybierz pozycję Objective-C jako język źródłowyDodawanie odwołania do platformy
MyNativeAOTLibrary
- Na karcie Cele ogólne w
MyiOSApp
obszarze Struktury, biblioteki i zawartość osadzona wybierz pozycję + , aby dodaćMyNativeAOTLibrary
jako strukturę, do których się odwołujesz - W oknie dialogowym wybierz pozycję Dodaj inne ->Dodaj pliki , a następnie przejdź do lokalizacji
MyNativeAOTLibrary.framework
i wybierz ją. - Po wybraniu opcji ustaw
Embed and Sign
dla platformyMyNativeAOTLibrary
- Na karcie Cele ogólne w
Dodawanie
MyNativeAOTLibrary.framework
lokalizacji do listy ścieżek wyszukiwania struktury na karcie Ustawienia kompilacjiEdytuj
main.m
, wywołując ujawnioną metodęaotsample_add
zarządzaną i drukując wynikextern int aotsample_add(int a, int b); int main(int argc, char * argv[]) { ... NSLog(@"2 + 5 = %d", aotsample_add(2, 5)); ... }
Wybierz fizyczne urządzenie z systemem iOS i skompiluj/uruchom aplikację
Sprawdź dzienniki po pomyślnym uruchomieniu aplikacji. Aplikacja powinna zostać wyświetlona:
2 + 5 = 7
Uwaga
W przypadku komputerów MacCatalyst należy wykonać te same kroki, z wyjątkiem kroku 7, w którym element docelowy uruchamiania musi być ustawiony jako: Mac (Mac Catalyst)
.
Tworzenie bibliotek statycznych przy użyciu funkcji NativeAOT dla platform podobnych do systemu iOS
Jak opisano w artykule Tworzenie bibliotek natywnych — omówienie, lepiej jest tworzyć biblioteki udostępnione za pośrednictwem bibliotek statycznych ze względu na kilka ograniczeń.
Jednak w razie potrzeby możesz utworzyć bibliotekę statyczną, wykonując kroki tworzenia udostępnionej biblioteki i dołączając dodatkową właściwość w pliku projektu:
<NativeLib>Static</NativeLib>
Po opublikowaniu projektu można znaleźć bibliotekę MyNativeAOTLibrary.a
statyczną pod adresem: MyNativeAOTLibrary/bin/Release/net9.0/<rid>/publish
.
W tym artykule nie opisano sposobu korzystania z biblioteki statycznej i konfigurowania projektu odbiorcy.
Zawartość dodatku 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>