封装Lua for C#

来源:互联网 发布:美国地缘政治知乎 编辑:程序博客网 时间:2024/05/16 04:15

LuaInterface下载地址:

http://code.google.com/p/luainterface/


为了搞懂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):

 

[c-sharp] view plaincopy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Windows;  
  6. using System.Reflection;  
  7. using LuaInterface;  
  8.   
  9. namespace WPFLuaFramework  
  10. {  
  11.     /// <summary>  
  12.     /// Lua函数描述特性类  
  13.     /// </summary>  
  14.     public class LuaFunction : Attribute  
  15.     {  
  16.         private String FunctionName;  
  17.   
  18.         public LuaFunction(String strFuncName)  
  19.         {  
  20.             FunctionName = strFuncName;  
  21.         }  
  22.   
  23.         public String getFuncName()  
  24.         {  
  25.             return FunctionName;  
  26.         }  
  27.     }  
  28.   
  29.     /// <summary>  
  30.     /// Lua引擎  
  31.     /// </summary>  
  32.     class LuaFramework  
  33.     {  
  34.         private Lua pLuaVM = new Lua();//lua虚拟机  
  35.   
  36.         /// <summary>  
  37.         /// 注册lua函数  
  38.         /// </summary>  
  39.         /// <param name="pLuaAPIClass">lua函数类</param>  
  40.         public void BindLuaApiClass( Object pLuaAPIClass )  
  41.         {  
  42.             foreach (MethodInfo mInfo in pLuaAPIClass.GetType().GetMethods())  
  43.             {  
  44.                 foreach (Attribute attr in Attribute.GetCustomAttributes(mInfo))  
  45.                 {  
  46.                     string LuaFunctionName = (attr as LuaFunction).getFuncName();  
  47.                     pLuaVM.RegisterFunction(LuaFunctionName, pLuaAPIClass, mInfo);  
  48.                 }  
  49.             }  
  50.         }  
  51.   
  52.         /// <summary>  
  53.         /// 执行lua脚本文件  
  54.         /// </summary>  
  55.         /// <param name="luaFileName">脚本文件名</param>  
  56.         public void ExecuteFile(string luaFileName)  
  57.         {  
  58.             try  
  59.             {  
  60.                 pLuaVM.DoFile(luaFileName);  
  61.             }  
  62.             catch (Exception e)  
  63.             {  
  64.                 MessageBox.Show(e.ToString());  
  65.             }  
  66.         }  
  67.   
  68.         /// <summary>  
  69.         /// 执行lua脚本  
  70.         /// </summary>  
  71.         /// <param name="luaCommand">lua指令</param>  
  72.         public void ExecuteString(string luaCommand)  
  73.         {  
  74.             try  
  75.             {  
  76.                 pLuaVM.DoString(luaCommand);  
  77.             }  
  78.             catch (Exception e)  
  79.             {  
  80.                 MessageBox.Show(e.ToString());  
  81.             }  
  82.         }  
  83.     }  
  84. }  

 

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

 

[c-sharp] view plaincopy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Windows;  
  6.   
  7. namespace WPFLuaFramework  
  8. {  
  9.     class LuaAPI  
  10.     {  
  11.         [LuaFunction("lua1")]  
  12.         public void a1()  
  13.         {  
  14.             MessageBox.Show("a1 called");  
  15.         }  
  16.   
  17.         [LuaFunction("lua2")]  
  18.         public int a2()  
  19.         {  
  20.             MessageBox.Show("a2 called");  
  21.             return 0;  
  22.         }  
  23.   
  24.         [LuaFunction("lua3")]  
  25.         public void a3(string s)  
  26.         {  
  27.             MessageBox.Show("a3 called");  
  28.         }  
  29.     }  
  30. }  

 

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

 

[c-sharp] view plaincopy
  1. LuaFramework test = new LuaFramework();  
  2. test.BindLuaApiClass(new LuaAPI());  
  3. test.ExecuteFile("test.lua");  
  4. test.ExecuteString("lua1()");  

 

LUA代码如下

 

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

原创粉丝点击