建立和使用類似 iOS 平臺的自定義架構
從 .NET 9 開始,原生 AOT 支援發布不相依於 iOS 工作負載的 .NET 類別庫。類似 iOS 的平臺。 此支援可讓您建立可從 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>
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; } }
藉由指定適當的運行時間標識碼,發佈類別庫,並以所需的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) 封裝到架構中,才能從應用程式取用。
本節說明達成此作業所需的所有步驟,以及使用共用 NativeAOT 連結庫/架構之 iOS/MacCatalyst 應用程式的簡單案例。
注意
所述的步驟僅供示範之用。 實際需求可能會根據確切的使用案例而有所不同。
將共享連結庫封裝成自定義 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
- 將 附錄 的內容新增至已建立
Info.plist
的檔案
- 建立
最後一個步驟之後,架構結構看起來應該像這樣:
MyNativeAOTLibrary.framework
|_ MyNativeAOTLibrary
|_ Info.plist
將共享連結庫封裝成自定義 MacCatalyst 通用架構
通用架構需要 和 x64
架構的Arm64
二進位檔。
基於這個理由,您必須事先發佈以下列兩個 RID 為目標的原生連結庫: maccatalyst-arm64
和 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
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
- 將 附錄 的內容新增至已建立
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
目標一般] 索引卷標的 [架構]、[連結庫] 和 [內嵌內容] 底下,選取 + [新增MyNativeAOTLibrary
] 作為參考的架構 - 在對話框中,選擇 [ 新增其他 -> 新增檔案 ],然後流覽至 的位置
MyNativeAOTLibrary.framework
並加以選取 - 選取之後,請設定
Embed and Sign
架構MyNativeAOTLibrary
的選項
- 在 [
將位置新增
MyNativeAOTLibrary.framework
至 [建置設定] 索引標籤中的 [架構搜尋路徑] 清單呼叫公開的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)); ... }
選取您的實體 iOS 裝置並建置/執行應用程式
在應用程式成功啟動之後檢查記錄。 應用程式應該會列印出來:
2 + 5 = 7
注意
針對 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>