在 Windows 上使用原生代码
需要进行架构审查:本文档旨在支持针对 React Native 的“旧”或“遗留”架构的开发。它可能适用也可能不适用于新架构的开发,需要审查并可能需要更新。有关 React Native Windows 中 React Native 架构的信息,请参阅新旧架构。
有关 Windows 上原生开发的最新信息,请参阅原生平台:概述。
什么是 React Native for Windows 应用程序?
当您创建面向 React Native 旧架构的 React Native for Windows 应用程序时,您将获得一个通用 Windows 平台应用程序(也称为 UWP 应用程序)。
通用 Windows 平台允许您通过 Windows 运行时 (WinRT) 访问所有 Windows 设备上的一组通用功能。WinRT API 可以通过 C++(通过 C++/WinRT)或通过 .NET C# 访问。
.NET 中的 WinRT 支持
当前公开支持的 .NET 版本(.NET UWP)内置了对 WinRT 的支持。
Win32 桌面应用程序 vs. RNW 应用程序
无论您是 Windows 开发新手,还是 Win32 桌面应用程序老手,以下常见问题解答都应能回答您的一些常见问题。
当您通过Windows 入门中描述的步骤为 React Native 应用程序添加 Windows 支持时,您将获得一个 UWP 应用程序。
注意:默认情况下,init-windows 命令会创建一个 C++ 应用程序,但也可以创建一个 C# 应用程序。语言选择会影响您的性能和使用原生模块的能力,因此如果这些问题对您很重要,强烈建议您阅读为原生代码选择 C++ 或 C#。
无论您的应用程序使用何种语言,RNW 应用程序都是 UWP 应用程序,因此具有以下特点:
API 接口
这些应用程序可以访问的 API 集是所有 Windows API(即通过 WinRT 访问的那些)的子集。请参阅:
- 适用于 UWP 应用程序的 Win32 和 COM API
- 通用 Windows 平台应用程序中不支持的 CRT 函数
- 通用 Windows 平台 (UWP) 应用程序中 Windows API 的替代方案
隔离
应用程序在应用程序容器(一种沙盒)中运行。这为应用程序提供了一种安全的方式来安装、访问文件系统等系统资源,并允许系统管理其生命周期(例如,当应用程序不在前台时暂停应用程序)。这意味着默认情况下,RNW 应用程序不能访问任意文件系统位置、启动任意进程等。需要访问这些功能类型的 UWP 应用程序可以通过应用程序功能声明来做到这一点。
打包
React Native Windows 应用程序经过签名和打包。打包是一种机制,通过该机制,应用程序及其依赖项获得一个身份,该身份用于确定需要系统功能(例如文件系统访问)的 API 调用是否应成功。
分发
React Native Windows 应用程序可以通过以下方式分发、安装和更新:
- 通过Microsoft Store。
- 如果您是企业或教育机构,则通过您的私人商店。另请参阅向企业分发 LOB 应用程序。
- 使用应用程序安装程序。
值得注意的是,您不能仅仅“复制 EXE 文件”,因为应用程序包不仅仅包含主可执行文件,还包含应用程序清单、资产、依赖框架库等。
此外,Store 提交过程还有以下要求:
- 提交到 Store 的 UWP 应用程序必须通过 Windows 应用程序认证工具包 (WACK) 验证。
- 使用 C# 或其他托管语言编写并提交到 Store 的 UWP 应用程序必须使用 .NET Native 工具链构建。这是在发布模式下构建 C# 应用程序的默认设置,但在调试模式下则不是,因此在调试模式下构建的应用程序将被 Store 拒绝。
非 WinRT 库的使用
您使用的任何库都应构建为 WinRT 组件。换句话说,您无法轻易链接为 Win32 桌面应用程序构建的库,除非额外工作。
- C++/CX 是一种 C++ 方言,允许编写 UWP 应用程序,但不支持用于编写 RNW 应用程序。文章如何在通用 Windows 平台应用程序中使用现有 C++ 代码讨论了如何在 WinRT 上下文中使用 C++/CX 消费非 WinRT 库,但大部分内容应适用于使用 C++/WinRT,这是编写 RNW 应用程序的受支持方式。
- 另请参阅从 C++/CX 迁移到 C++/WinRT 的指南。
- 为 .NET 桌面框架构建的库不能直接由 UWP 访问。您可以创建一个调用 .NET 框架的 .NET Standard 库,然后从 UWP 应用程序调用 .NET Standard 中间件。
本地测试和内部循环
对于内部开发,您可以通过旁加载和通过松散文件注册部署应用程序以进行测试。在调试模式(默认)下构建时,run-windows 命令会执行应用程序的松散文件注册以将其本地安装。使用--release
开关构建时,CLI 会将真实包安装到您的本地计算机。这要求应用程序已签名,并且用于签名的证书受将安装应用程序的计算机信任。请参阅创建用于包签名的证书和证书简介。
调试崩溃和报告问题
如果您的应用程序“硬崩溃”(原生代码遇到错误条件并且您的应用程序关闭),您需要调查代码的原生部分。如果问题出在 Microsoft.ReactNative
层,请在 React Native for Windows 存储库中提交错误,并提供原生堆栈跟踪,最好是带有符号的崩溃转储。为方便起见,您可以使用脚本收集原生崩溃转储和堆栈跟踪。以下是说明:
- 从https://aka.ms/RNW/analyze-crash.ps1下载脚本,例如下载到 C:\temp
- 打开管理员 PowerShell
- 如果尚未启用运行未签名脚本,请运行:
Set-ExecutionPolicy Unrestricted
- 运行脚本并向其传递应用程序 exe 的名称(通常是应用程序的名称):
C:\temp\analyze-crash.ps1 -ExeName MyApp
该脚本将为您的应用程序设置自动崩溃转储收集,下载原生调试工具(包括命令行调试器 cdb),并要求您重现崩溃。
此时,您可以启动应用程序(例如,如果您已将其部署到本地设备,则从“开始”菜单)。当应用程序崩溃时,它将生成一个崩溃转储。然后,您可以按 Enter 键恢复脚本的执行,脚本将使用 cdb 自动分析崩溃转储,并将结果输出到文件 analyze.log
。
脚本随后会将日志内容复制到剪贴板,在记事本中打开日志文件,并启动浏览器在 react-native-windows 存储库中提交问题,您可以在其中将堆栈跟踪粘贴到错误模板中。