本文为 csdn rcfalcon 原创,转载请标明出处。

作者:rcfalcon

原文:http://blog.csdn.net/rcfalcon/article/details/5583095

为了搞懂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");

放到.NetFramework 4.0里 需要在

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

里 加一句 判断
if(attr is LuaFunction)

C#注册类方法到Lua相关推荐

  1. LUA C 交互 cocos

    注册 函数给Lua使用 lua_newtable(L); lua_pushstring(L, "callStaticMethod"); lua_pushcfunction(L, L ...

  2. lua 函数调用1 -- 闭包详解和C调用

    这里, 简单的记录一下lua中闭包的知识和C闭包调用 前提知识: 在lua api小记2中已经分析了lua中值的结构, 是一个 TValue{value, tt}组合, 如果有疑问, 可以去看一下 一 ...

  3. Lua和C++交互总结(很详细)

    出处:http://blog.csdn.net/shun_fzll/article/details/39120965 一.lua堆栈 要理解lua和c++交互,首先要理解lua堆栈. 简单来说,Lua ...

  4. [转载]Lua和C++交互详细总结

    原文请看:Lua和C++交互详细总结 转自:http://cn.cocos2d-x.org/tutorial/show?id=1474 一.Lua堆栈 要理解Lua和C++交互,首先要理解Lua堆栈. ...

  5. 【转贴】Lua 5.0 参考手册

    作者: Roberto Ierusalimschy, Luiz Henrique de Figueiredo, Waldemar Celes Copyright © 2003 Tecgraf, PUC ...

  6. 手写简版spring --2--实现Bean的定义、注册、获取

    一.目标 在上一章节我们初步依照 Spring Bean 容器的概念,实现了一个粗糙版本的代码实现.那么本章节我们需要结合已实现的 Spring Bean 容器进行功能完善,实现 Bean 容器关于 ...

  7. Lua和C++交互详细总结

    一.Lua堆栈 要理解Lua和C++交互,首先要理解Lua堆栈. 简单来说,Lua和C/C++语言通信的主要方法是一个无处不在的虚拟栈.栈的特点是先进后出. 在Lua中,Lua堆栈就是一个struct ...

  8. 用LuaBridge为Lua绑定C/C++对象

    最近为了总结Lua绑定C/C++对象的各种方法.第三方库和原理,学习了LuaBridge库为Lua绑定C/C++对象,下面是学习笔记,实质是对该库的 Reference Manual 基本上翻译了一遍 ...

  9. C++和Lua交互教程(基于LuaBridge)

    作者:查志旺 ,向日葵远程控制软件前端开发工程师. 最近公司需要做向日葵远程控制软件跨平台项目,为了代码的可复用性,需嵌入跨平台脚本语言,我们选择了Lua,理由是Lua由标准C编写而成,几乎在所有操作 ...

最新文章

  1. 拜访了这位小哥的GitHub后,我失眠了!
  2. 使用masonry布局旋转View的问题
  3. size-t数据类型 ssize-t数据类型
  4. python 之 collections
  5. 设计模式入门(策略模式)
  6. Linux信号处理机制
  7. ERROR: Unable to write in /opt/module/hadoop-3.1.3/logs. Aborting
  8. .net面试问答(大汇总)(转)
  9. 一个例子理解java面向对象的机制
  10. 【渗透测试】Sunlogin-RCE(向日葵)
  11. js中ajax提交表单提交表单提交,JS中ajax请求提交form表单
  12. 迪恩素材教程资源图片下载站源码 dz社区论坛discuz 模板
  13. 小赛毛游C记——分支和循环语句(1)
  14. Ajax学习日志(五)—— 如何传递json格式请求参数
  15. 记事狗微博php,记事狗微博系统_366rtc 源码采用php实现 - 下载 - 搜珍网
  16. 低功耗蓝牙(BLE)-- advertisements广播篇
  17. mysql sandbox_用mysql_sandbox建立快速测试环境
  18. [含论文+源码等]SSM酒店管理系统旅店管理
  19. Java 43---SpringMVC框架(1)
  20. 一个c程序的执行是从哪里开始到哪里结束

热门文章

  1. mqtt server python_Python使用mqtt极简例子
  2. html 元素换行_超文本标记语言的段落与换行显示!
  3. z-index 绝对定位的盒子居中
  4. mysql之解决查询表时区分大小写的问题
  5. cad连接mysql,AutoCAD 2004 使用外部数据库
  6. K8S专题-dashboardUI组件2
  7. preact源码学习(3)
  8. 北理乐学c语言基础答案晕,北理乐学C语言答案.doc
  9. mysql查询重复用户名_mysql取出以上用户名(去除重复),score值最高的所有记录,查出重复记录...
  10. 《Visual Studio Code权威指南》读后总结