Поделиться через


Создание и использование пользовательских платформ для платформ, таких как iOS

Начиная с .NET 9, Native AOT поддерживает публикацию библиотек классов .NET, которые не зависят от рабочих нагрузок iOS для платформ, таких как iOS. Эта поддержка позволяет создавать автономные собственные библиотеки, которые можно использовать из приложений iOS, Mac Catalyst и tvOS.

Внимание

Этот подход не обеспечивает встроенную поддержку взаимодействия Objective-C, а для обеспечения взаимодействия могут потребоваться дополнительные адаптации кода (например, аргументы ссылочного типа маршаллинга).

Создание общих библиотек

В этом разделе описаны шаги по созданию простого проекта библиотеки классов .NET с поддержкой NativeAOT и создания собственной библиотеки для платформ, таких как iOS.

  1. Скачивание пакета SDK для .NET 9

  2. Создание проекта библиотеки классов

    dotnet new classlib -n "MyNativeAOTLibrary"
    
  3. Добавьте следующие свойства в файл проекта MyNativeAOTLibrary.csproj

    <PublishAot>true</PublishAot>
    <PublishAotUsingRuntimePack>true</PublishAotUsingRuntimePack>
    
  4. Измените исходный MyNativeAOTLibrary/Class1.cs код, чтобы предоставить управляемый метод, чтобы его можно было ссылаться из машинного кода как aotsample_add. Например:

    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. Опубликуйте библиотеку классов и нацелите нужную платформу iOS, указав соответствующий идентификатор среды выполнения (на который ссылается следующая ссылка: <rid>):

    dotnet publish -r <rid> MyNativeAOTLibrary/MyNativeAOTLibrary.csproj
    

Успешное завершение предыдущего шага создает пару файлов: общую библиотеку MyNativeAOTLibrary.dylib и ее символы отладкиMyNativeAOTLibrary.dylib.dSYM, расположенные по адресу: MyNativeAOTLibrary/bin/Release/net9.0/<rid>/publish/

Примечание.

Для создания универсальных платформ необходимо опубликовать библиотеку классов для обеих Arm64 платформ и x64 архитектур для данной платформы. Это означает, что необходимо повторить шаг 5 с другим идентификатором среды выполнения. Например, вы опубликуете библиотеку классов с идентификаторами среды выполнения как maccatalyst-arm64 maccatalyst-x64 необходимые условия для упаковки общей библиотеки в настраиваемую универсальную платформу MacCatalyst.

Создание и использование пользовательской платформы

Apple накладывает требование, чтобы общие библиотеки (Dylibs) должны быть упаковированы в платформы для использования из приложений.

В этом разделе описаны все необходимые шаги для этого и простого сценария приложения iOS/MacCatalyst, использующее общую библиотеку и платформу NativeAOT.

Примечание.

Описанные шаги предназначены только для демонстрационных целей. Фактические требования могут отличаться в зависимости от точного варианта использования.

Упаковка общей библиотеки в настраиваемую платформу iOS

  1. Создайте папку платформы:

    mkdir MyNativeAOTLibrary.framework
    
  2. Настройте команды загрузки:

    • LC_RPATH команда load

      install_name_tool -rpath @executable_path @executable_path/Frameworks MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib
      
    • LC_ID_DYLIB команда load

      install_name_tool -id @rpath/MyNativeAOTLibrary.framework/MyNativeAOTLibrary MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib
      
  3. Вручную упаковав двоичный файл в универсальный файл:

    lipo -create MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib -output MyNativeAOTLibrary.framework/MyNativeAOTLibrary
    
  4. Добавьте файл списка свойств в платформу:

    • Создайте файл Info.plist .
    touch MyNativeAOTLibrary.framework/Info.plist
    

После последнего шага структура платформы должна выглядеть следующим образом:

MyNativeAOTLibrary.framework
    |_ MyNativeAOTLibrary
    |_ Info.plist

Упаковка общей библиотеки в пользовательскую универсальную платформу MacCatalyst

Для универсальных платформ требуются двоичные файлы для обеих Arm64 платформ и x64 архитектуры. По этой причине необходимо опубликовать собственные библиотеки, предназначенные как для следующих идентификаторов maccatalyst-arm64 RID, так и maccatalyst-x64.

  1. Создайте структуру папок платформы:

    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. Настройте команды загрузки:

    • LC_RPATH команда 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 команда 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. Вручную упаковав двоичный файл в универсальный файл:

    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. Добавьте файл списка свойств в платформу:

    • Создайте файл Info.plist .
    touch MyNativeAOTLibrary.framework/Versions/A/Resources/Info.plist
    

После последнего шага структура платформы должна выглядеть следующим образом:

MyNativeAOTLibrary.framework
    |_ MyNativeAOTLibrary -> Versions/Current/MyNativeAOTLibrary
    |_ Resources -> Versions/Current/Resources
    |_ Versions
        |_ A
        |   |_ Resources
        |   |   |_ Info.plist
        |   |_ MyNativeAOTLibrary
        |_ Current -> A

Использование пользовательских платформ

  1. Open Xcode (в этом примере Xcode 16.0 используется)

  2. Создание нового проекта App

  3. Выберите имя приложения (например, MyiOSApp) и выберите Objective-C в качестве исходного языка

  4. Добавление ссылки на MyNativeAOTLibrary платформу

    • На вкладке MyiOSApp "Общие" в разделе "Платформы", "Библиотеки" и "Внедренное содержимое" выберите+, чтобы добавить MyNativeAOTLibrary в качестве ссылки платформу.
    • В диалоговом окне выберите "Добавить другие файлы">, а затем перейдите к расположению MyNativeAOTLibrary.framework и выберите его.
    • После выбора установите Embed and Sign параметр для платформы MyNativeAOTLibrary

    Справочник по добавлению платформы Xcode

  5. Добавление MyNativeAOTLibrary.framework расположения в список путей поиска Платформы на вкладке "Параметры сборки "

    Xcode добавить путь поиска платформы

  6. Изменение main.m путем вызова управляемого метода aotsample_add и печати результата

    extern int aotsample_add(int a, int b);
    int main(int argc, char * argv[]) {
        ...
        NSLog(@"2 + 5 = %d", aotsample_add(2, 5));
        ...
    }
    
  7. Выбор физического устройства iOS и сборка или запуск приложения

  8. Проверьте журналы после успешного запуска приложения. Приложение должно распечатать следующее: 2 + 5 = 7

Примечание.

Для MacCatalyst используйте те же действия, что и шаг 7, где необходимо задать назначение запуска следующим образом: Mac (Mac Catalyst)

Создание статических библиотек с помощью NativeAOT для платформ iOS

Как описано в обзоре создания собственных библиотек, лучше создавать общие библиотеки по статическим из-за нескольких ограничений.

Однако при необходимости можно создать статическую библиотеку, выполнив действия по созданию общей библиотеки и включая дополнительное свойство в файле проекта:

<NativeLib>Static</NativeLib>

После публикации проекта статическую библиотеку MyNativeAOTLibrary.a можно найти по адресу: MyNativeAOTLibrary/bin/Release/net9.0/<rid>/publish

В этой статье не описывается, как использовать статическую библиотеку и настраивать проект потребителя.

Содержимое приложения 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>