封装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
{
    /// <summary>
    /// Lua函数描述特性类
    /// </summary>
    public class LuaFunction : Attribute
    {
        private String FunctionName;

        public LuaFunction(String strFuncName)
        {
            FunctionName = strFuncName;
        }

        public String getFuncName()
        {
            return FunctionName;
        }
    }

    /// <summary>
    /// Lua引擎
    /// </summary>
    class LuaFramework
    {
        private Lua pLuaVM = new Lua();//lua虚拟机

        /// <summary>
        /// 注册lua函数
        /// </summary>
        /// <param name="pLuaAPIClass">lua函数类</param>
        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);
                }
            }
        }

        /// <summary>
        /// 执行lua脚本文件
        /// </summary>
        /// <param name="luaFileName">脚本文件名</param>
        public void ExecuteFile(string luaFileName)
        {
            try
            {
                pLuaVM.DoFile(luaFileName);
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
            }
        }

        /// <summary>
        /// 执行lua脚本
        /// </summary>
        /// <param name="luaCommand">lua指令</param>
        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");

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值