iOS に似たプラットフォーム用のカスタム フレームワークを作成して使用する
.NET 9 以降、ネイティブ AOT では、iOS に似たプラットフォームの iOS ワークロードに依存しない .NET クラス ライブラリの発行がサポートされています。 このサポートにより、iOS、Mac Catalyst、および tvOS アプリケーションから使用できる自己完結型ネイティブ ライブラリを作成できます。
重要
このアプローチには、組み込みの Objective-C 相互運用性のサポートは付属していません。相互運用性を実現するには、追加のコード調整 (参照型引数のマーシャリングなど) が必要になる場合があります。
共有ライブラリをビルドする
このセクションでは、NativeAOT をサポートする単純な .NET クラス ライブラリ プロジェクトを作成し、そこから iOS に似たプラットフォーム用のネイティブ ライブラリを生成する手順について説明します。
.NET 9 SDK のダウンロード
クラス ライブラリ プロジェクトを作成する
dotnet new classlib -n "MyNativeAOTLibrary"
プロジェクト ファイルに次のプロパティを追加する
MyNativeAOTLibrary.csproj
<PublishAot>true</PublishAot> <PublishAotUsingRuntimePack>true</PublishAotUsingRuntimePack>
ネイティブ コードから
aotsample_add
として参照できるように、MyNativeAOTLibrary/Class1.cs
ソース コードを編集してマネージド メソッドを公開します。 次に例を示します。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/
) というファイルのペアが生成されます。
Note
ユニバーサル フレームワークを作成するには、特定のプラットフォームの Arm64
アーキテクチャと x64
アーキテクチャの両方のクラス ライブラリを発行する必要があります。
つまり、別のランタイム識別子で手順 5 を繰り返す必要があります。
たとえば、共有ライブラリをカスタム MacCatalyst ユニバーサル フレームワークにパッケージ化するための前提条件として、maccatalyst-arm64
とmaccatalyst-x64
の両方のランタイム識別子を持つクラス ライブラリを発行。
カスタム フレームワークを作成して使用する
Apple では、アプリケーションから使用するために、共有ライブラリ (.dylibs) をフレームワークにパッケージ化する必要があるという要件が課されています。
このセクションでは、これを実現するために必要なすべての手順と、共有 NativeAOT ライブラリ/フレームワークを使用する iOS/MacCatalyst アプリケーションの単純なシナリオについて説明します。
Note
説明されている手順は、デモンストレーションのみを目的とします。 実際の要件は、正確なユース ケースによって異なる場合があります。
共有ライブラリをカスタム iOS フレームワークにパッケージ化する
フレームワーク フォルダーを作成します。
mkdir MyNativeAOTLibrary.framework
読み込みコマンドを調整します。
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
バイナリをユニバーサル ファイルに手動でパッケージ化します。
lipo -create MyNativeAOTLibrary/bin/Release/net9.0/ios-arm64/publish/MyNativeAOTLibrary.dylib -output MyNativeAOTLibrary.framework/MyNativeAOTLibrary
フレームワークにプロパティ リスト ファイルを追加します。
Info.plist
ファイルを作成します。
touch MyNativeAOTLibrary.framework/Info.plist
- appendixの内容を作成した
Info.plist
ファイルに追加します。
最後の手順の後、フレームワークの構造は次のようになります。
MyNativeAOTLibrary.framework
|_ MyNativeAOTLibrary
|_ Info.plist
共有ライブラリをカスタム MacCatalyst ユニバーサル フレームワークにパッケージ化する
ユニバーサル フレームワークには、 Arm64
アーキテクチャと x64
アーキテクチャの両方にバイナリが必要です。
このため、 maccatalyst-arm64
と maccatalyst-x64
の両方の RID を対象とするネイティブ ライブラリを事前に発行する必要があります。
フレームワーク フォルダー構造を作成します。
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
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
バイナリをユニバーサル ファイルに手動でパッケージ化します。
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
- appendixの内容を作成した
Info.plist
ファイルに追加します。
最後の手順の後、フレームワークの構造は次のようになります。
MyNativeAOTLibrary.framework
|_ MyNativeAOTLibrary -> Versions/Current/MyNativeAOTLibrary
|_ Resources -> Versions/Current/Resources
|_ Versions
|_ A
| |_ Resources
| | |_ Info.plist
| |_ MyNativeAOTLibrary
|_ Current -> A
カスタム フレームワークを使用する
開く
Xcode
(この例ではXcode 16.0
が使用されています)新しい
App
プロジェクトを作成するアプリの名前 (
MyiOSApp
など) を選択し、ソース言語として Objective-C を選択しますMyNativeAOTLibrary
フレームワークへの参照を追加するMyiOSApp
ターゲット General タブの Frameworks、Libraries、Embedded Content で、参照先フレームワークとしてMyNativeAOTLibrary
を追加する+を選択します- ダイアログで、[その他追加 ->ファイルの追加] を選択し
MyNativeAOTLibrary.framework
の場所を参照して選択します。 - 選択したら、
MyNativeAOTLibrary
フレームワークEmbed and Sign
オプションを設定します
Build の [設定] タブの Framework 検索パスの一覧に
MyNativeAOTLibrary.framework
の場所を追加します公開されているマネージド メソッド
aotsample_add
を呼び出し、結果を出力してmain.m
を編集する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
Note
MacCatalyst の場合は、手順 7 を除く同じ手順を使用します。実行先は次のように設定する必要があります: Mac (Mac Catalyst)
。
iOS に似たプラットフォーム用の NativeAOT を使用して静的ライブラリを構築する
ネイティブ ライブラリ 構築の概要で説明されているように、いくつかの制限があるため、静的ライブラリよりも共有ライブラリを構築することをお勧めします。
ただし、必要に応じて、共有ライブラリをビルドし、プロジェクト ファイルに追加のプロパティを含める手順に従って、スタティック ライブラリを構築できます。
<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>
.NET