概觀
原生連結庫 Interop(先前稱為「苗條式系結」方法),是指在 .NET MAUI 應用程式中存取原生 SDK 的模式,包括適用於 Android 的 .NET、適用於 iOS 的 .NET,以及 Mac Catalyst 應用程式的 .NET。 其概念是使用簡化的 API 介面,建立您自己的抽象或精簡的「包裝函式」,以使用您有興趣從 .NET 呼叫的原生 SDK。 原生「包裝函式」連結庫/架構專案會使用 Java/Kotlin 和/或 Xcode,使用 Objective-C/Swift 在 Android Studio 中建立。 當您只需要 SDK API 介面的一小部分時,這個方法特別有用,不過它也適用於相同的較大 API 介面使用方式。

瞭解使用原生連結庫 Interop 的時機和原因
原生連結庫 Interop 是與原生連結庫整合的非常有效的方法,雖然它可能不一定最適合您的專案。 一般而言,如果您已經維護系結,而且很自在地繼續這樣做,就不需要變更方法。 對於需要大量使用連結庫 API 的專案,或針對支援 .NET MAUI 開發人員的廠商,傳統系結可能仍然更合適。 不過,原生連結庫 Interop 提供通常更容易了解、實作和維護的替代方案。
原生連結庫 Interop 的主要優點是其效能與簡單的 API 介面。 當包裝函式只涉及 .NET 支援的基本類型時,現有的系結工具可以使用最少的手動介入來產生可靠的定義,而傳統系結通常需要這種定義。 這讓程式變得簡單明瞭,特別是因為包裝函式 API 實作通常會遵循 SDK 檔,而且通常允許直接從廠商文件複製。
雖然初始設定可能比較複雜,但管理基礎 SDK 的更新通常需要較少的工作。 更新通常牽涉到只調整版本並重建專案。 即使 API 介面或 SDK 發生中斷性變更,包裝函式 API 介面和 .NET 應用程式的使用量更有可能保持穩定,相較於傳統系結,需要較少的調整。
總而言之,原生連結庫 Interop 提供數個優點:
- 使用原生語言和工具簡化下列 SDK 檔案
- 建立工作系結需要較少的手動介入
- 讓維護更容易,並減少必要更新的頻率
- 增強應用程式與基礎 SDK 變更的隔離
雖然解決相依性鏈結(特別是在 Android 上)可能需要與傳統系結類似的工作,但簡化的實作和維護優點讓 Native Library Interop 成為許多專案吸引人的選擇。
了解 Maui.NativeLibraryInterop
透過 Native Library Interop 建立和維護建立的系結,有一個值得注意的挑戰,就是手動聯合原生專案、其原生相依性、建置輸出和 .NET 系結連結庫專案。 Maui.NativeLibraryInterop 可協助您從 建置和自定義範例,以協助您快速啟動程式,以符合您自己的應用程式需求。
其中一部分包括透過 MSBuild 調用協調建置程式的一部分。 此可包括:
- 解析或下載原生 SDK 相依性
- 建置原生精簡系結專案及其相依性
- 將必要的原生成品移至預期的工作目錄
- 產生系結連結庫專案的 API 定義
系結建置程式會擴充,藉由將 NuGet 套件新增 CommunityToolkit.Maui.NativeLibraryInterop.BuildTasks 至系結專案,以取得和建置原生 SDK 相依性:
<ItemGroup>
<PackageReference Include="CommunityToolkit.Maui.NativeLibraryInterop.BuildTasks" Version="0.0.1-pre1" />
</ItemGroup>
Android 系結專案會新增指向 @(NLIGradleProjectReference) 包含原生包裝函式 gradle 專案的根資料夾的專案:
<ItemGroup>
<NLIGradleProjectReference Include="../native" >
<ModuleName>newbinding</ModuleName>
<!-- Metadata applicable to @(AndroidLibrary) will be used if set, otherwise the following defaults will be used:
<Bind>true</Bind>
<Pack>true</Pack>
-->
</NLIGradleProjectReference>
</ItemGroup>
iOS 系結專案會新增指向 @(NLIXcodeProjectReference) 原生包裝函式 Xcode 專案的專案:
<ItemGroup>
<NLIXcodeProjectReference Include="../native/NewBinding/NewBinding.xcodeproj">
<SchemeName>NewBinding</SchemeName>
<SharpieNamespace>NewBinding</SharpieNamespace>
<SharpieBind>true</SharpieBind>
<!-- Metadata applicable to @(NativeReference) will be used if set, otherwise the following defaults will be used:
<Kind>Framework</Kind>
<SmartLink>true</SmartLink>
-->
</NLIXcodeProjectReference>
</ItemGroup>
Android 系結專案會自動考慮任何選擇性的手動修改,例如透過 Metadata.xml 轉換檔案實作的手動修改。

iOS 系結連結庫項目必須包含明確定義的 API。 為了協助解決此問題,Objective-Sharpie 可以在產生的原生架構上自動執行,以產生 API 定義檔(ApiDefinition.cs)。 建立和維護 iOS 系結專案所使用的ApiDefintion.cs檔案時,這可作為有用的參考。

必要的原生相依性會內嵌到系結元件中。 當 .NET 專案新增原生項目的參考時,原生相依性會自動包含在應用程式中。