Udostępnij za pośrednictwem


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.

  1. Pobierz zestaw SDK platformy .NET 9

  2. Tworzenie projektu biblioteki klas

    dotnet new classlib -n "MyNativeAOTLibrary"
    
  3. Dodaj następujące właściwości do pliku projektu MyNativeAOTLibrary.csproj

    <PublishAot>true</PublishAot>
    <PublishAotUsingRuntimePack>true</PublishAotUsingRuntimePack>
    
  4. 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 jako aotsample_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;
        }
    }
    
  5. 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.dSYMdebugowania , 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

  1. Utwórz folder struktury:

    mkdir MyNativeAOTLibrary.framework
    
  2. Dostosuj polecenia ładowania:

    • LC_RPATH load , polecenie

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

      install_name_tool -id @rpath/MyNativeAOTLibrary.framework/MyNativeAOTLibrary MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib
      
  3. Ręcznie spakuj plik binarny do pliku uniwersalnego:

    lipo -create MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib -output MyNativeAOTLibrary.framework/MyNativeAOTLibrary
    
  4. Dodaj plik listy właściwości do struktury:

    • Tworzenie Info.plist pliku
    touch MyNativeAOTLibrary.framework/Info.plist
    
    • Dodaj zawartość dodatku do utworzonego Info.plist pliku

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.

  1. 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
    
  2. Dostosuj polecenia ładowania:

    • LC_RPATH load , polecenie

      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 load , polecenie

      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. 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
    
  4. Dodaj plik listy właściwości do struktury:

    • Tworzenie Info.plist pliku
    touch MyNativeAOTLibrary.framework/Versions/A/Resources/Info.plist
    
    • Dodaj zawartość dodatku do utworzonego Info.plist pliku

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

  1. Otwórz Xcode (w tym przykładzie Xcode 16.0 użyto)

  2. Tworzenie nowego App projektu

  3. Wybierz nazwę aplikacji (na przykład MyiOSApp) i wybierz pozycję Objective-C jako język źródłowy

  4. Dodawanie 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 platformy MyNativeAOTLibrary

    Dokumentacja struktury dodawania środowiska Xcode

  5. Dodawanie MyNativeAOTLibrary.framework lokalizacji do listy ścieżek wyszukiwania struktury na karcie Ustawienia kompilacji

    Ścieżka wyszukiwania dodawania platformy Xcode

  6. Edytuj main.m , wywołując ujawnioną metodę aotsample_add zarządzaną i drukując wynik

    extern int aotsample_add(int a, int b);
    int main(int argc, char * argv[]) {
        ...
        NSLog(@"2 + 5 = %d", aotsample_add(2, 5));
        ...
    }
    
  7. Wybierz fizyczne urządzenie z systemem iOS i skompiluj/uruchom aplikację

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