Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

192 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ResetHeaderTool

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 中的主流程按以下阶段执行:

  1. Load — 根据 projectType/projectPath 创建对应的 IProject 实现并加载项目结构(模块、源文件列表等)。
  2. PrepareInfo — 解析所有源文件,构建反射信息(类、枚举、函数、字段等)。
  3. CodePluginApply — 依次执行 plugins 参数指定的每个 CodePlugin,对每个模块的头文件 / 源文件 / C# 文件或程序集 / Protobuf 文件生成代码。
  4. Cleanup — 删除不再由任何插件生成的历史文件。
  5. 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 runResetHeaderTool/ResetHeaderTool/ResetHeaderTool.csproj 上进行开发调试。

命令行参数

参数 说明
projectPath 项目路径(必填):Unreal 为 .uproject 路径,其余为项目根目录。
projectType 项目类型:Unreal / ReMake / Unity / ReBuildTool / BindingGenerate / Custom;若省略,会依据 projectPath 后缀自动推断(.uprojectUnreal,否则默认 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)

License

本项目基于 Apache License 2.0 开源。

About

just another Cpp Header Tool

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages