跳到主要内容

设计概览

:::tip 谁该读本文 选型者、新接入开发者、需要理解「为什么这样设计」的读者。 日常 API 用法请直接看 使用指南;实现细节见 规范文档。 :::

ZLua 把 Lua 当作另一种 Native:类比 P/Invoke,用声明式特性统一双向互操作,底层桥接由 CodeGen 自动生成。

P/Invoke 与 L/Invoke 对照

C# 互操作职责ZLua 对应
P/InvokeC# 调用 native 函数[LuaInvoke](L/Invoke)— C# 调用 Lua
MonoPInvokeCallbacknative 回调 C#[MonoLuaCallback] — 仅 int (IntPtr L) 原生回调
MarshalAs覆盖默认编组[LuaMarshalAs] — C# ↔ Lua 编组覆盖

核心原则

原则说明
统一双向调用C#→Lua:[LuaInvoke];Lua→C#:CSharp 懒注册,语法贴近 C#
自动生成Editor 注入 C# 桥;Il2Cpp 发布生成 C++ 桥;开发者只写 extern 声明
深度集成LuaAppDomain.Initialize 一次完成 CLR + lua_State + zlua
C++ 直桥Player 字段 offset 直读、方法经 methodPointer,无海量 C# Wrap
零 Wrapper 膨胀相同签名共享桥接函数,而非每成员一个 Wrap

自动生成流水线

阶段Mono (Editor)Il2Cpp (Player)
LuaInvokednlib → RunLuaFuncIL → InternalCall + C++
Lua→C# 成员首次访问 EnsureBinding + 桥接缓存Codegen 预生成(MVP 为子集)
开发者感知

与 xLua 的路径差异(摘要)

维度xLua 常见路径ZLua
类型暴露生成 C# Wrap / CodeEmitCSharp 根表 + 元表三表
C#→LuaLuaEnv.DoString / DelegateBridge[LuaInvoke] 声明式
Player 性能Wrap 或生成 C++(视配置)设计目标:C++ 直桥 + 签名复用

详见 与 xLua 对比调用路径概览

何时读哪份文档

你的问题推荐阅读
怎么从 C# 调 Lua?C# 调用 Lua 指南
Lua 怎么访问 C# 类型?类型系统概览
参数怎么传递?编组模型概览
Editor 与 Player 差别?双运行时
完整设计语义?设计规范

相关文档