Создание и использование пользовательских платформ для платформ, таких как iOS
Начиная с .NET 9, Native AOT поддерживает публикацию библиотек классов .NET, которые не зависят от рабочих нагрузок iOS для платформ, таких как iOS. Эта поддержка позволяет создавать автономные собственные библиотеки, которые можно использовать из приложений iOS, Mac Catalyst и tvOS.
Внимание
Этот подход не обеспечивает встроенную поддержку взаимодействия Objective-C, а для обеспечения взаимодействия могут потребоваться дополнительные адаптации кода (например, аргументы ссылочного типа маршаллинга).
Создание общих библиотек
В этом разделе описаны шаги по созданию простого проекта библиотеки классов .NET с поддержкой NativeAOT и создания собственной библиотеки для платформ, таких как iOS.
Скачивание пакета SDK для .NET 9
Создание проекта библиотеки классов
dotnet new classlib -n "MyNativeAOTLibrary"
Добавьте следующие свойства в файл проекта
MyNativeAOTLibrary.csproj
<PublishAot>true</PublishAot> <PublishAotUsingRuntimePack>true</PublishAotUsingRuntimePack>
Измените исходный
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; } }
Опубликуйте библиотеку классов и нацелите нужную платформу 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
Создайте папку платформы:
mkdir MyNativeAOTLibrary.framework
Настройте команды загрузки:
LC_RPATH
команда loadinstall_name_tool -rpath @executable_path @executable_path/Frameworks MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib
LC_ID_DYLIB
команда loadinstall_name_tool -id @rpath/MyNativeAOTLibrary.framework/MyNativeAOTLibrary MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib
Вручную упаковав двоичный файл в универсальный файл:
lipo -create MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib -output MyNativeAOTLibrary.framework/MyNativeAOTLibrary
Добавьте файл списка свойств в платформу:
- Создайте файл
Info.plist
.
touch MyNativeAOTLibrary.framework/Info.plist
- Добавление содержимого из приложения в созданный
Info.plist
файл
- Создайте файл
После последнего шага структура платформы должна выглядеть следующим образом:
MyNativeAOTLibrary.framework
|_ MyNativeAOTLibrary
|_ Info.plist
Упаковка общей библиотеки в пользовательскую универсальную платформу MacCatalyst
Для универсальных платформ требуются двоичные файлы для обеих Arm64
платформ и x64
архитектуры.
По этой причине необходимо опубликовать собственные библиотеки, предназначенные как для следующих идентификаторов maccatalyst-arm64
RID, так и maccatalyst-x64
.
Создайте структуру папок платформы:
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
Настройте команды загрузки:
LC_RPATH
команда loadinstall_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
команда loadinstall_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
Вручную упаковав двоичный файл в универсальный файл:
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
Добавьте файл списка свойств в платформу:
- Создайте файл
Info.plist
.
touch MyNativeAOTLibrary.framework/Versions/A/Resources/Info.plist
- Добавление содержимого из приложения в созданный
Info.plist
файл
- Создайте файл
После последнего шага структура платформы должна выглядеть следующим образом:
MyNativeAOTLibrary.framework
|_ MyNativeAOTLibrary -> Versions/Current/MyNativeAOTLibrary
|_ Resources -> Versions/Current/Resources
|_ Versions
|_ A
| |_ Resources
| | |_ Info.plist
| |_ MyNativeAOTLibrary
|_ Current -> A
Использование пользовательских платформ
Open
Xcode
(в этом примереXcode 16.0
используется)Создание нового проекта
App
Выберите имя приложения (например,
MyiOSApp
) и выберите Objective-C в качестве исходного языкаДобавление ссылки на
MyNativeAOTLibrary
платформу- На вкладке
MyiOSApp
"Общие" в разделе "Платформы", "Библиотеки" и "Внедренное содержимое" выберите+, чтобы добавитьMyNativeAOTLibrary
в качестве ссылки платформу. - В диалоговом окне выберите "Добавить другие файлы">, а затем перейдите к расположению
MyNativeAOTLibrary.framework
и выберите его. - После выбора установите
Embed and Sign
параметр для платформыMyNativeAOTLibrary
- На вкладке
Добавление
MyNativeAOTLibrary.framework
расположения в список путей поиска Платформы на вкладке "Параметры сборки "Изменение
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)); ... }
Выбор физического устройства iOS и сборка или запуск приложения
Проверьте журналы после успешного запуска приложения. Приложение должно распечатать следующее:
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>