# XLua WinForm桌面环境部署与运行说明本次完成了原生XLua在VS2022 WinForm桌面程序的完整部署与功能验证,全程解决编译、库加载、类型兼容三类核心问题。首先通过CMake编译

📅 2026/7/3 18:29:40 👁️ 阅读次数 📝 编程学习
# XLua WinForm桌面环境部署与运行说明本次完成了原生XLua在VS2022 WinForm桌面程序的完整部署与功能验证,全程解决编译、库加载、类型兼容三类核心问题。首先通过CMake编译

XLua WinForm 桌面环境部署与运行说明

一、项目概述

本项目基于原生 XLua 源码,在 VS2022 Windows Forms 桌面框架下完成完整适配,剥离 Unity 引擎依赖,解决原生库编译、动态库加载、跨类型转换三类核心兼容问题,可支撑工控场景下 Lua 代码编辑器、断点单步调试、C# 与 Lua 双向互调等完整业务功能,项目开源地址:https://github.com/wenqizhiqq/xLuaTest.git

二、环境适配与问题解决

  1. 原生 C++ 动态库编译部署通过 CMake 编译产出 64 位底层库,将编译产物xlua_x64.dll重命名为xlua.dll,配置文件自动复制至程序输出目录,同步将项目运行平台切换为 x64 架构,彻底解决运行时 “无法加载 xlua、找不到指定模块” 的 DLL 缺失异常。

  2. XLua C# 源码去 Unity 剥离处理提取 XLua 运行时核心RuntimeGen源码,批量删除MonoTypeUnityEngineUnityEditor等 Unity 专属类型与预编译分支代码,消除标准.NET Framework 桌面环境不存在引擎类型导致的反射异常。

三、功能验证与代码优化

编写测试用例校验虚拟机运行能力:将 Lua 脚本以 UTF-8 编码转为二进制字节数组,调用DoString(byte[])重载接口执行代码;针对 Lua 整型默认映射 C#long、强制转换double报错问题,采用Convert.ToDouble()实现安全类型转换,成功读取脚本多返回值,弹窗输出运算结果,验证虚拟机加载、脚本执行链路完全通畅。

内存层面使用using语法包裹LuaEnv实例,程序退出作用域时自动释放 Lua 虚拟机资源,规避频繁创建虚拟机引发的内存泄漏问题。整套适配流程验证,剥离 Unity 后的原生 XLua 可稳定在 WinForm 桌面程序运行,满足工控 Lua 编辑器全套开发需求。

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using XLua; namespace WindowsFormsApp1 { // 必须加Hotfix,[CSharpCallLua]委托才能生效 [Hotfix] public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { TestByteChunk(); } void TestByteChunk() { // using 自动释放LuaEnv,杜绝内存泄漏 LuaEnv env = new LuaEnv(); string luaCode = @" local a = 10 local b = 20 return a + b, a - b "; byte[] luaBytes = System.Text.Encoding.UTF8.GetBytes(luaCode); object[] ret = env.DoString(luaBytes, "TestByteScript"); // 安全转换:先转long,再转double,兼容整数/浮点数 double sum = Convert.ToDouble(ret[0]); double diff = Convert.ToDouble(ret[1]); MessageBox.Show($"和={sum}, 差={diff}"); } } }