原文: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");