共用方式為


建立和使用類似 iOS 平臺的自定義架構

從 .NET 9 開始,原生 AOT 支援發布不相依於 iOS 工作負載的 .NET 類別庫。類似 iOS 的平臺。 此支援可讓您建立可從 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. MyNativeAOTLibrary/Class1.cs編輯原始碼以公開 Managed 方法,使其可從原生程式代碼參考為 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/

注意

若要建立通用架構,必須發行指定平台的 類別庫 Arm64x64 架構。 這表示您必須使用不同的運行時間標識子重複步驟 5。 例如,您會將具有 maccatalyst-arm64maccatalyst-x64 運行時間標識符的類別庫發佈為將共用連結庫封裝成自定義 MacCatalyst 通用架構的必要條件

建立及取用自定義架構

Apple 需要將共享連結庫 (.dylibs) 封裝到架構中,才能從應用程式取用。

本節說明達成此作業所需的所有步驟,以及使用共用 NativeAOT 連結庫/架構之 iOS/MacCatalyst 應用程式的簡單案例。

注意

所述的步驟僅供示範之用。 實際需求可能會根據確切的使用案例而有所不同。

將共享連結庫封裝成自定義 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
    
    • 附錄 的內容新增至已建立 Info.plist 的檔案

最後一個步驟之後,架構結構看起來應該像這樣:

MyNativeAOTLibrary.framework
    |_ MyNativeAOTLibrary
    |_ Info.plist

將共享連結庫封裝成自定義 MacCatalyst 通用架構

通用架構需要 和 x64 架構的Arm64二進位檔。 基於這個理由,您必須事先發佈以下列兩個 RID 為目標的原生連結庫: maccatalyst-arm64maccatalyst-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
    
    • 附錄 的內容新增至已建立 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目標一般] 索引卷標的 [架構]、[連結庫] 和 [內嵌內容] 底下,選取 + [新增MyNativeAOTLibrary] 作為參考的架構
    • 在對話框中,選擇 [ 新增其他 -> 新增檔案 ],然後流覽至 的位置 MyNativeAOTLibrary.framework 並加以選取
    • 選取之後,請設定 Embed and Sign 架構 MyNativeAOTLibrary 的選項

    Xcode 新增架構參考

  5. 將位置新增MyNativeAOTLibrary.framework至 [建置設定] 索引標籤中的 [架構搜尋路徑] 清單

    Xcode 新增架構搜尋路徑

  6. 呼叫公開的Managed方法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

注意

針對 MacCatalyst,請使用步驟 7 以外的相同步驟,其中執行目的地必須設定為: Mac (Mac Catalyst)

使用類似 iOS 平臺的 NativeAOT 建置靜態庫

如建置原生連結庫概觀中所述,由於數項限制,最好透過靜態連結庫建置共享連結庫。

不過,如有需要,您可以遵循建置共用連結庫的步驟來建置靜態庫,並在項目檔中包含其他屬性:

<NativeLib>Static</NativeLib>

發佈項目之後,可以在:找到靜態庫MyNativeAOTLibrary.aMyNativeAOTLibrary/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>