zoukankan      html  css  js  c++  java
  • 【转】封装Lua for C#

    原文:http://blog.csdn.net/rcfalcon/article/details/5583095

    为了搞懂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 plain copy
     
    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 plain copy
     
    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 plain copy
     
    1. LuaFramework test = new LuaFramework();  
    2. test.BindLuaApiClass(new LuaAPI());  
    3. test.ExecuteFile("test.lua");  
    4. test.ExecuteString("lua1()");  

    LUA代码如下

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

  • 相关阅读:
    easyui学习笔记1—增删改操作
    sql点滴37—mysql中的错误Data too long for column '' at row 1
    javascript获取当前url
    escape()、encodeURI()、encodeURIComponent()区别详解
    js文本框提示和自动完成
    javascript js string.Format()收集
    超链接标签为什么会造成页面颤抖
    asp.net mvc 4.0常见的几个问题
    如何使用Flashfxp上传下载文件
    点击按钮显示谷歌地图
  • 原文地址:https://www.cnblogs.com/anduinlothar/p/6247986.html
Copyright © 2011-2022 走看看