C# 的编译时代码生成
需要进行架构审查:本文档旨在支持针对 React Native 的“旧”或“遗留”架构的开发。它可能适用也可能不适用于新架构的开发,需要审查并可能需要更新。有关 React Native Windows 中 React Native 架构的信息,请参阅新旧架构。
有关 Windows 上原生开发的最新信息,请参阅原生平台:概述。
本文档和底层平台代码正在开发中。
在之前版本的 React Native for Windows 中,C# 模块的代码生成是使用反射来完成的。自 0.63 版本起,我们通过添加编译时代码生成改进了这一点。
这种方法有几个优点:
- 分析和反射代码的开销无需在每次应用程序启动时发生,它只在构建时发生一次。
- 改进的错误报告。由于生成器对源代码进行操作,因此在检测到错误时可以提供文件和行信息。
- 您将在编译时而不是在代码执行时发现所有错误。
如何使用
新项目
如果您从模板创建新项目(推荐方式),则无需执行任何操作即可利用此新功能,它默认启用。
返回使用反射
如果您遇到编译时代码生成问题,可以通过编辑 MSBuild 项目(.vcxproj
或 .csproj
文件)并添加以下内容来恢复以前的行为:
<PropertyGroup>
...
+ <ReactNativeCodeGenEnabled>true</ReactNativeCodeGenEnabled>
</PropertyGourp>
接下来,您必须添加基于反射的生成。打开 ReactPackageProvider.cs
并进行以下更改:
在文件顶部添加一个 using 语句:
using Microsoft.ReactNative; + using Microsoft.ReactNative.Managed;
将对生成实现的调用替换为基于反射的调用。
public void CreatePackage(IReactPackageBuilder packageBuilder) { - CreatePackageImplementation(packageBuilder); + packageBuilder.AddReflectionReactPackageProvider<ReactPackageProvider>(); }
免责声明:反射逻辑可能会在不久的将来移除。
升级旧项目
当您将现有 0.62 项目升级到更高版本时,您将已经导入共享文件,因此您将默认获得代码生成。您的 C# 代码可能尚未为此设置。要启用代码生成,您需要执行以下操作:
- 添加一个名为
ReactPackageProvider.cs
的文件,其内容如下,并填写您的应用程序的正确命名空间:using Microsoft.ReactNative; namespace ... { public partial class ReactPackageProvider : IReactPackageProvider { public void CreatePackage(IReactPackageBuilder packageBuilder) { CreatePackageImplementation(packageBuilder); } /// <summary> /// This method is implemented by the C# code generator /// </summary> partial void CreatePackageImplementation(IReactPackageBuilder packageBuilder); } }
- 在
App.xaml.cs
中的构造函数中连接注册:public App() { ... PackageProviders.Add(new Microsoft.ReactNative.Managed.ReactPackageProvider()); + PackageProviders.Add(new ReactPackageProvider());
工作原理
在构建过程中,新工具被连接到 MSBuild 中。它与 XAML 的代码生成同时运行。使用的目标名为 ReactNativeManagedCodeGen
。构建将参数写入 obj
文件夹中的响应文件,例如:windows\MyProject\obj\x64\Debug\MyProject.ReactNativeCodeGen\MyProject.ReactNativeCodeGen.rsp
。该工具接受 C# 编译器接收的相同参数,即源文件、已解析的包和项目引用以及定义。然后,它使用这些参数通过 C# 编译器 API (Roslyn) 创建一个工作区,分析代码并将注册调用发送到一个生成在 .rsp
文件旁边的 C# 文件中。例如 windows\MyProject\obj\x64\Debug\MyProject.ReactNativeCodeGen\MyProject.ReactNativeCodeGen.g.cs
。然后,此自动生成的 C# 文件包含在您的应用程序中。
您的应用程序需要有两部分代码以确保其连接。如果您使用模板创建项目,则所有内容都已处理。本段仅旨在解释其工作原理。首先,它需要在一个名为 ReactPackageProvider
的部分类中,该类位于项目的默认命名空间中。此类的部分方法必须声明为以下签名:
partial void CreatePackageImplementation(IReactPackageBuilder packageBuilder);
该生成的文件实现了此方法。此类应实现 IReactPackageProvider
并从 CreatePackage
函数调用部分方法。然后,您需要通过在构造函数中添加以下调用来在应用程序的 XAML 启动代码中注册此类:
PackageProviders.Add(new ReactPackageProvider());
如果您创建一个新模板,或在上面升级旧项目的说明中,可以找到完整的代码。