当前位置:编程学习 > C#/ASP.NET >>

封装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):

 

[c-sharp] 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()); 
            } 
        } 
    } 

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;
        }

     

补充:软件开发 , C# ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,