ResetHeaderTool 是一个跨引擎 / 跨构建系统的 C++(及 C#、Protobuf)反射代码生成工具,理念上类似于 Unreal Engine 的 Header Tool(UHT),但被设计为可以脱离 UE 独立工作,接入 Unreal、Unity、CMake(ReMake)、自研构建系统(ReBuildTool)等多种项目形态。
它通过解析源码中的自定义反射标记(RECLASS / REENUM / REFUNCTION / REFIELD 等),驱动可插拔的代码生成插件(CodePlugin),为 C++ / C# / Protobuf 源文件生成绑定代码、扩展代码等,并支持增量生成、跨平台裁剪与版本控制系统联动。
- 多前端解析:内置 C++ 解析器(自研 Tokenizer + CppAst AST 双通道)、基于 Roslyn 的 C# 解析器(
Microsoft.CodeAnalysis.CSharp),以及 Protobuf 解析器。 - 多项目类型接入:
Unreal/Unity/ReMake(CMake)/ReBuildTool(自研构建系统)/BindingGenerate(声明式绑定生成)/Custom(自定义IProject实现),可通过projectType参数切换。 - 插件化代码生成:通过实现
ICodePluginInterface及其针对 C++ / C++ AST / Protobuf / C# 程序集 / C# 源文件的细分接口,可以扩展任意代码生成逻辑;插件可打包为独立 DLL,通过pluginDlls动态加载。 - 平台裁剪:插件可用
[SupportPlatform]/[NotSupportPlatform]特性声明支持的目标平台(Win64 / IOS / Android / Mac / PS5 / Linux / LinuxArm64 / TVOS / HoloLens),工具会按targetplatform参数自动过滤。 - 增量生成:基于文件时间戳与生成产物映射表(
GeneratedInfoTimeStamp.json/GeneratedFiles.json)做增量判断,仅在源文件变化、插件集合变化或目标平台变化时才重新生成(也可用force强制全量刷新)。 - 过期文件清理:生成完成后自动清理不再需要的历史生成文件(
Cleanup阶段)。 - 版本控制联动:内置 Git / SVN / Perforce 适配(
Util/VCS),生成完成后可自动对发生变化的输出目录执行签出(checkout)操作,便于在受控目录下提交生成产物。
Program.cs 中的主流程按以下阶段执行:
- Load — 根据
projectType/projectPath创建对应的IProject实现并加载项目结构(模块、源文件列表等)。 - PrepareInfo — 解析所有源文件,构建反射信息(类、枚举、函数、字段等)。
- CodePluginApply — 依次执行
plugins参数指定的每个CodePlugin,对每个模块的头文件 / 源文件 / C# 文件或程序集 / Protobuf 文件生成代码。 - Cleanup — 删除不再由任何插件生成的历史文件。
- VCS Operation — 对发生变化的输出目录执行 Git / SVN / Perforce 签出。
projectType |
说明 |
|---|---|
Unreal |
解析 .uproject / *.Build.cs / *.uplugin,按 UE 模块组织生成代码;也可选启用对原生 UCLASS / USTRUCT / UENUM / UPROPERTY 等宏的解析。 |
Unity |
通过 .asmdef 与已编译程序集发现模块(含 Editor 程序集),面向 C# 反射生成。 |
ReMake |
面向 CMake 项目,按 Public / Interface / Private 目录约定组织头文件与源文件。 |
ReBuildTool |
面向自研构建系统,从其中间产物目录(InterMedia/ResetHeaderTool/ProjectInfo)中读取模块信息。 |
BindingGenerate |
声明式绑定生成:读取 *.binding.json 描述文件,基于 CppAst 生成跨语言绑定代码。 |
Custom |
通过 customProject 参数指定实现了 IProject 的自定义类型(可来自 pluginDlls)。 |
在 C++ 代码中使用以下宏标记需要生成反射 / 扩展代码的类型(宏本身在编译期展开为空,仅供 ResetHeaderTool 静态解析):
RE_CLASS()
class AnotherClass
{
GENERATE_EXTENSION_BODY()
// ...
};RECLASS/REENUM/REFUNCTION/REFIELD/REPARAM/REPRAGMA— 分别标记类、枚举、函数、字段、参数与编译指示。GENERATE_EXTENSION_BODY()— 在类体内占位,生成的扩展代码会注入到此处。
生成产物按 HeaderToolGen/ 目录组织,典型文件后缀包括 .gen.h / .gen.cpp / .body.h / .extension.h。
- .NET 8 SDK
- 目标语言相关工具链(如需要,Unreal/Unity 项目需各自的引擎环境)
仓库根目录下的 Scripts/ 提供了发布脚本:
# macOS / Linux
./Scripts/BuildHeaderTool.sh
# Windows
Scripts\BuildHeaderTool.bat会为 win-x64 / osx-x64 / osx-arm64 / linux-x64 发布自包含(self-contained)的可执行文件,输出至:
Binary/Win64/HeaderTool
Binary/Mac64/HeaderTool
Binary/MacArm64/HeaderTool
Binary/Linux/HeaderTool
也可以直接用 dotnet build / dotnet run 在 ResetHeaderTool/ResetHeaderTool/ResetHeaderTool.csproj 上进行开发调试。
| 参数 | 说明 |
|---|---|
projectPath |
项目路径(必填):Unreal 为 .uproject 路径,其余为项目根目录。 |
projectType |
项目类型:Unreal / ReMake / Unity / ReBuildTool / BindingGenerate / Custom;若省略,会依据 projectPath 后缀自动推断(.uproject → Unreal,否则默认 ReMake)。 |
projectName |
项目名称,缺省时从 projectPath 推断。 |
plugins |
启用的 CodePlugin 类名列表,用 , 分隔(必填)。 |
pluginDlls |
额外加载的插件 DLL 文件名列表,用 | 分隔,会在 dllSearchPath 与当前目录下递归查找。 |
dllSearchPath |
额外的 DLL 搜索路径,用 | 分隔。 |
customProject |
当 projectType=Custom 时,指定实现 IProject 的类型全名。 |
targetplatform |
目标平台:Win64 / IOS / Android / Mac / PS5 / Linux / LinuxArm64 / TVOS / HoloLens。 |
includeModules |
仅处理指定模块名(| 分隔)。 |
includeModuleRegs |
仅处理匹配指定正则的模块名(| 分隔)。 |
ignoreFiles |
额外忽略的文件名列表,用 , 分隔。 |
debug |
开启解析器调试日志。 |
force |
强制全量重新生成,忽略增量缓存。 |
csout |
C# 程序集输出路径(仅 ToMono 类插件使用)。 |
extraAssemblySearchPaths |
C# 程序集 Provider 的额外搜索路径。 |
代码生成逻辑通过实现 ResetHeaderTool.CodePlugin 命名空间下的接口来扩展:
ICodePluginInterface— 所有插件的基础接口(模块处理前后钩子、生成目录、清理逻辑)。ICppCodePluginInterface— 基于自研 Tokenizer 的 C++ 头文件 / 源文件处理。ICppAstPluginInterface— 基于 CppAst 的 C++ AST 级处理(用于更复杂的绑定生成场景)。IProtobufPluginInterface— Protobuf 文件处理。ICSharpAssemblyPluginInterface/ICSharpFilePluginInterface— 基于已编译程序集(Mono.Cecil)或 Roslyn 语法树的 C# 处理。
插件类需要提供静态 Create() 工厂方法,可用 [SupportPlatform(...)] / [NotSupportPlatform(...)] 限定生效平台,编译为独立 DLL 后通过 pluginDlls 参数加载,再通过 plugins 参数按类名启用。
TestCase/ 目录下提供了两个可参考的示例工程:
TestCase/ReMakeCase— 基于 CMake 的 C++ 示例工程,演示RE_CLASS等标记与生成产物结构。TestCase/UnityCase— Unity 示例工程,演示基于.asmdef的模块划分与 C# 代码生成。
ResetHeaderTool/
├─ ResetHeaderTool/ResetHeaderTool/ # 工具主程序(.NET 8)
│ ├─ CodePlugin/ # 插件接口与平台特性定义
│ ├─ CppParser/
│ │ ├─ FrontEnd/ # C++ / C# / Protobuf 解析前端
│ │ └─ SourceCode/
│ │ ├─ ProjectTypes/ # Unreal / Unity / ReMake / ReBuildTool / BindingGenerate 各项目类型实现
│ │ └─ FileTypes/ # 各类源文件的中间表示
│ └─ Util/ # 日志、CLI 解析、代码构建器、VCS(Git/SVN/Perforce)等工具
├─ Scripts/ # 发布/构建脚本
└─ TestCase/ # 示例工程(ReMakeCase / UnityCase)
本项目基于 Apache License 2.0 开源。