封装Lua for C#

为了搞懂LUA在我们的GDEX中到底怎么用,我决定研究一下如何比较好的在WPF里封装一个基于lua的APP  framework。

 

今天先对Lua for C#进行了一次简单的封装。

在C#下用过Lua的人都知道,用C#实现一个函数之后和LUA绑定,需要用到Lua类的RegisterFunction方法。

 

在函数很少的情况下很好用,但是若需要绑定C#里成百上千个函数,则麻烦了,添加一个函数,至少每次需要修改两个地方:函数实现,函数绑定(RegisterFunction)。并且如果在lua中绑定的名字和C#中不一样,则更麻烦,还需要维护一个函数映射。

 

今天翻了一下google,翻出GameDev.net上一篇老外的文章,叫《Using Lua with C#》,看了一下,它的方法不错。(改天考虑翻译这篇文章),不过他的示例代码实在是太太太冗长了,大部分是生成函数介绍和函数帮助文档等,直接忽略。把它最核心的东西拿过来,然后自己封装了一下,用起来感觉不错。

 

基本思想是,使用C#的Attribute来标记函数,实现自动绑定。

 

核心部分代码如下(LuaFramework.cs):

 

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Reflection; using LuaInterface; namespace WPFLuaFramework { ///

/// Lua函数描述特性类 /// public class LuaFunction : Attribute { private String FunctionName; public LuaFunction(String strFuncName) { FunctionName = strFuncName; } public String getFuncName() { return FunctionName; } } /// /// Lua引擎 /// class LuaFramework { private Lua pLuaVM = new Lua();//lua虚拟机 /// /// 注册lua函数 /// /// lua函数类 public void BindLuaApiClass( Object pLuaAPIClass ) { foreach (MethodInfo mInfo in pLuaAPIClass.GetType().GetMethods()) { foreach (Attribute attr in Attribute.GetCustomAttributes(mInfo)) { string LuaFunctionName = (attr as LuaFunction).getFuncName(); pLuaVM.RegisterFunction(LuaFunctionName, pLuaAPIClass, mInfo); } } } /// /// 执行lua脚本文件 /// /// 脚本文件名 public void ExecuteFile(string luaFileName) { try { pLuaVM.DoFile(luaFileName); } catch (Exception e) { MessageBox.Show(e.ToString()); } } /// /// 执行lua脚本 /// /// lua指令 public void ExecuteString(string luaCommand) { try { pLuaVM.DoString(luaCommand); } catch (Exception e) { MessageBox.Show(e.ToString()); } } } }

 

我的LUA API类如下,用于实现C# for lua的函数(LuaAPI.cs)

 

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; namespace WPFLuaFramework { class LuaAPI { [LuaFunction("lua1")] public void a1() { MessageBox.Show("a1 called"); } [LuaFunction("lua2")] public int a2() { MessageBox.Show("a2 called"); return 0; } [LuaFunction("lua3")] public void a3(string s) { MessageBox.Show("a3 called"); } } }

 

最后看调用代码,是不是很简单

 

LuaFramework test = new LuaFramework(); test.BindLuaApiClass(new LuaAPI()); test.ExecuteFile("test.lua"); test.ExecuteString("lua1()");

 

LUA代码如下

 

lua1();
lua2();
lua3("test");

 

 

你可能感兴趣的:(lua,.NET)