原文:http://blog.csdn.net/rcfalcon/article/details/5583095函数
为了搞懂LUA在咱们的GDEX中到底怎么用,我决定研究一下如何比较好的在WPF里封装一个基于lua的APP framework。google
今天先对Lua for C#进行了一次简单的封装。lua
在C#下用过Lua的人都知道,用C#实现一个函数以后和LUA绑定,须要用到Lua类的RegisterFunction方法。spa
在函数不多的状况下很好用,可是若须要绑定C#里成百上千个函数,则麻烦了,添加一个函数,至少每次须要修改两个地方:函数实现,函数绑定(RegisterFunction)。而且若是在lua中绑定的名字和C#中不同,则更麻烦,还须要维护一个函数映射。.net
今天翻了一下google,翻出GameDev.NET上一篇老外的文章,叫《Using Lua with C#》,看了一下,它的方法不错。(改天考虑翻译这篇文章),不过他的示例代码实在是太太太冗长了,大部分是生成函数介绍和函数帮助文档等,直接忽略。把它最核心的东西拿过来,而后本身封装了一下,用起来感受不错。翻译
基本思想是,使用C#的Attribute来标记函数,实现自动绑定。blog
核心部分代码以下(LuaFramework.cs):ip
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Windows;
- using System.Reflection;
- using LuaInterface;
-
- namespace WPFLuaFramework
- {
-
-
-
- public class LuaFunction : Attribute
- {
- private String FunctionName;
-
- public LuaFunction(String strFuncName)
- {
- FunctionName = strFuncName;
- }
-
- public String getFuncName()
- {
- return FunctionName;
- }
- }
-
-
-
-
- class LuaFramework
- {
- private Lua pLuaVM = new 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);
- }
- }
- }
-
-
-
-
-
- public void ExecuteFile(string luaFileName)
- {
- try
- {
- pLuaVM.DoFile(luaFileName);
- }
- catch (Exception e)
- {
- MessageBox.Show(e.ToString());
- }
- }
-
-
-
-
-
- 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");
- }
- }
- }
最后看调用代码,是否是很简单get
- LuaFramework test = new LuaFramework();
- test.BindLuaApiClass(new LuaAPI());
- test.ExecuteFile("test.lua");
- test.ExecuteString("lua1()");
LUA代码以下
lua1();lua2();lua3("test");