次の方法で共有


iOS に似たプラットフォーム用のカスタム フレームワークを作成して使用する

.NET 9 以降、ネイティブ AOT では、iOS に似たプラットフォームの iOS ワークロードに依存しない .NET クラス ライブラリの発行がサポートされています。 このサポートにより、iOS、Mac Catalyst、および tvOS アプリケーションから使用できる自己完結型ネイティブ ライブラリを作成できます。

重要

このアプローチには、組み込みの Objective-C 相互運用性のサポートは付属していません。相互運用性を実現するには、追加のコード調整 (参照型引数のマーシャリングなど) が必要になる場合があります。

共有ライブラリをビルドする

このセクションでは、NativeAOT をサポートする単純な .NET クラス ライブラリ プロジェクトを作成し、そこから iOS に似たプラットフォーム用のネイティブ ライブラリを生成する手順について説明します。

  1. .NET 9 SDK のダウンロード

  2. クラス ライブラリ プロジェクトを作成する

    dotnet new classlib -n "MyNativeAOTLibrary"
    
  3. プロジェクト ファイルに次のプロパティを追加する MyNativeAOTLibrary.csproj

    <PublishAot>true</PublishAot>
    <PublishAotUsingRuntimePack>true</PublishAotUsingRuntimePack>
    
  4. ネイティブ コードから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;
        }
    }
    
  5. 適切なランタイム識別子を指定して、クラス ライブラリを発行し、目的の 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-arm64maccatalyst-x64の両方のランタイム識別子を持つクラス ライブラリを発行

カスタム フレームワークを作成して使用する

Apple では、アプリケーションから使用するために、共有ライブラリ (.dylibs) をフレームワークにパッケージ化する必要があるという要件が課されています。

このセクションでは、これを実現するために必要なすべての手順と、共有 NativeAOT ライブラリ/フレームワークを使用する iOS/MacCatalyst アプリケーションの単純なシナリオについて説明します。

Note

説明されている手順は、デモンストレーションのみを目的とします。 実際の要件は、正確なユース ケースによって異なる場合があります。

共有ライブラリをカスタム 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
    
    • appendixの内容を作成したInfo.plist ファイルに追加します。

最後の手順の後、フレームワークの構造は次のようになります。

MyNativeAOTLibrary.framework
    |_ MyNativeAOTLibrary
    |_ Info.plist

共有ライブラリをカスタム MacCatalyst ユニバーサル フレームワークにパッケージ化する

ユニバーサル フレームワークには、 Arm64 アーキテクチャと x64 アーキテクチャの両方にバイナリが必要です。 このため、 maccatalyst-arm64maccatalyst-x64の両方の RID を対象とするネイティブ ライブラリを事前に発行する必要があります。

  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
    
    • appendixの内容を作成したInfo.plist ファイルに追加します。

最後の手順の後、フレームワークの構造は次のようになります。

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

カスタム フレームワークを使用する

  1. 開く Xcode (この例では Xcode 16.0 が使用されています)

  2. 新しい App プロジェクトを作成する

  3. アプリの名前 ( MyiOSAppなど) を選択し、ソース言語として Objective-C を選択します

  4. MyNativeAOTLibrary フレームワークへの参照を追加する

    • MyiOSAppターゲット General タブの Frameworks、Libraries、Embedded Content で、参照先フレームワークとしてMyNativeAOTLibraryを追加する+を選択します
    • ダイアログで、[その他追加 ->ファイルの追加] を選択しMyNativeAOTLibrary.frameworkの場所を参照して選択します。
    • 選択したら、MyNativeAOTLibrary フレームワークEmbed and Signオプションを設定します

    Xcode のフレームワークの追加リファレンス

  5. Build の [設定] タブの Framework 検索パスの一覧にMyNativeAOTLibrary.frameworkの場所を追加します

    Xcode でフレームワークの検索パスを追加する

  6. 公開されているマネージド メソッド 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));
        ...
    }
    
  7. 物理 iOS デバイスを選択し、アプリをビルド/実行する

  8. アプリが正常に起動された後、ログを調べます。 アプリは次の内容を出力する必要があります。 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>