概述
原生库互操作(以前称作“精简绑定”方法)是指一种在 .NET MAUI 应用(包括 .NET for Android 应用、.NET for iOS 应用和 .NET for Mac Catalyst 应用)中访问原生 SDK 的模式。 其思路是创建你自己的抽象层或轻量“包装器”,为你希望从 .NET 调用的本地 SDK 提供一个简化的 API 接口。 原生“封装”库/框架项目是在 Android Studio 中使用 Java/Kotlin 和/或在 Xcode 中使用 Objective-C/Swift 创建的。 当你只需要 SDK 的 API 图面的一小部分时,此方法特别有用(尽管它也同样适用于大型 API 图面使用情况)。
理解何时以及为何使用原生库互操作
原生库互操作是与原生库集成的一种非常有效的方法,不过它未必始终适合你的项目。 一般来说,如果你已经在维护绑定,并且可以放心地继续这样做,则无需改变方法。 对于需要广泛使用库的 API 的项目或对于支持 .NET MAUI 开发人员的供应商,传统绑定可能仍然更合适。 但是,本机库互操作提供了一种通常更容易理解、实现和维护的替代方案。
原生库互操作的一个关键优势是它对于简单的 API 接口非常有效。 当包装器仅涉及 .NET 支持的基元类型时,现有绑定工具可通过最少的手动干预生成可靠的定义,这通常是传统绑定所必需的。 这使得该过程变得简单明了,特别是因为包装器 API 实现通常遵循 SDK 文档,并且通常允许从供应商文档直接复制。
虽然初始设置可能更为复杂,但管理基础 SDK 的更新通常需要更少的工作。 更新通常仅涉及调整版本和重新生成项目。 即使 API 图面或 SDK 中发生了中断性变更,包装 API 图面和 .NET 应用程序的使用也更有可能保持稳定,与传统绑定相比,需要进行的调整更少。
总之,本机库互操作提供了以下几个优点:
- 使用原生语言和工具简化以下 SDK 文档
- 需要更少的手动干预来创建工作绑定
- 使维护更轻松并降低必要更新的频率
- 增强应用与底层 SDK 变化的隔离性
尽管梳理依赖链(尤其是在 Android 上)所需的工作量可能与传统绑定相当,但实现与维护方面的简化优势仍使原生库互操作成为许多项目颇具吸引力的选择。
了解 Maui.NativeLibraryInterop
创建和维护通过本机库互操作创建的绑定的一个显著挑战是手动合并本机项目、其本机依赖项、生成输出和 .NET 绑定库项目。 Maui.NativeLibraryInterop 可帮助你基于这些示例进行构建,并根据你自己的应用需求进行自定义,从而快速开始这一过程。
这其中包括通过调用 MSBuild 来编排构建过程中的某些环节。 这可能包括:
- 解析或下载原生 SDK 依赖项
- 构建本机精简绑定项目及其依赖项
- 将所需的本地构件移动到预期的工作目录
- 生成绑定库项目的 API 定义
Android 绑定项目将添加一个指向 build.gradle 文件的 @(AndroidGradleProject) 项,该文件将用于构建 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 转换文件实现的修改。
iOS 绑定库项目必须包含显式定义的 API。 为此,必须对生成的原生框架运行 Objective-Sharpie,以生成与其一同提供的 API 定义文件(ApiDefinition.cs)。 这在创建和维护 iOS 绑定项目使用的ApiDefinition.cs文件时非常有用。
必要的本机依赖项已嵌入在绑定程序集中。 当 .NET 项目添加对本机项目的引用时,本机依赖项自动包含在应用中。