原生連結庫 Interop

概觀

原生程式庫互通操作(先前稱為「精簡繫結」方法)是指在 .NET MAUI 應用程式中存取原生 SDK 的一種模式,包括 .NET for Android、.NET for iOS 和 .NET for Mac Catalyst 應用程式。 這個想法是建立您自己的抽象層或精簡的「包裝函式」,為您想從 .NET 呼叫的原生 SDK 提供簡化的 API 介面。 原生「包裝器」程式庫/框架專案會在 Android Studio 中使用 Java/Kotlin 和/或在 Xcode 中使用 Objective-C/Swift 建立。 當您只需要 SDK API 介面的一小部分時,這個方法特別有用,不過它也適用於相同的較大 API 介面使用方式。

概念概觀:NativeLibraryInterop

瞭解使用原生連結庫 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 定義

Android 綁定專案會新增一個 @(AndroidGradleProject) 指向 build.gradle 檔案的項目,該檔案將用於建置 gradle 專案:

<ItemGroup>
    <AndroidGradleProject Include="../native/build.gradle.kts" >
        <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>
        -->
    </AndroidGradleProject>
</ItemGroup>

iOS 繫結專案會新增一個指向原生包裝函式 Xcode 專案的 @(XcodeProject) 項目:

<ItemGroup>
    <XcodeProject Include="../native/NewBinding/NewBinding.xcodeproj">
        <SchemeName>NewBinding</SchemeName>
        <!-- Metadata applicable to @(NativeReference) will be used if set, otherwise the following defaults will be used:
        <Kind>Framework</Kind>
        <SmartLink>true</SmartLink>
        -->
    </XcodeProject>
</ItemGroup>

Android 繫結專案會自動產生 API 定義,並將任何選用的手動修改納入考量,例如透過 Metadata.xml 轉換檔實作的修改。

概念概觀:適用於 Android 的 NativeLibraryInterop

iOS 系結連結庫項目必須包含明確定義的 API。 為了協助達成此目標,必須在產生的原生框架上執行 Objective-Sharpie ,並產生一個 API 定義檔案 (ApiDefinition.cs)。 這在建立和維護 iOS 綁定專案所用的 ApiDefinition.cs 檔案時,是個有用的參考資料。

概念概觀:適用於 iOS 的 NativeLibraryInterop

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