【轉】封裝Lua for C#

原文: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

 

 

[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. }  

 

 

最後看調用代碼,是否是很簡單get

 

 

[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");

相關文章
相關標籤/搜索