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

  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. namespace WPFLuaFramework
  9. {
  10. /// <summary>
  11. /// Lua函数描述特性类
  12. /// </summary>
  13. public class LuaFunction : Attribute
  14. {
  15. private String FunctionName;
  16. public LuaFunction(String strFuncName)
  17. {
  18. FunctionName = strFuncName;
  19. }
  20. public String getFuncName()
  21. {
  22. return FunctionName;
  23. }
  24. }
  25. /// <summary>
  26. /// Lua引擎
  27. /// </summary>
  28. class LuaFramework
  29. {
  30. private Lua pLuaVM = new Lua();//lua虚拟机
  31. /// <summary>
  32. /// 注册lua函数
  33. /// </summary>
  34. /// <param name="pLuaAPIClass">lua函数类</param>
  35. public void BindLuaApiClass( Object pLuaAPIClass )
  36. {
  37. foreach (MethodInfo mInfo in pLuaAPIClass.GetType().GetMethods())
  38. {
  39. foreach (Attribute attr in Attribute.GetCustomAttributes(mInfo))
  40. {
  41. string LuaFunctionName = (attr as LuaFunction).getFuncName();
  42. pLuaVM.RegisterFunction(LuaFunctionName, pLuaAPIClass, mInfo);
  43. }
  44. }
  45. }
  46. /// <summary>
  47. /// 执行lua脚本文件
  48. /// </summary>
  49. /// <param name="luaFileName">脚本文件名</param>
  50. public void ExecuteFile(string luaFileName)
  51. {
  52. try
  53. {
  54. pLuaVM.DoFile(luaFileName);
  55. }
  56. catch (Exception e)
  57. {
  58. MessageBox.Show(e.ToString());
  59. }
  60. }
  61. /// <summary>
  62. /// 执行lua脚本
  63. /// </summary>
  64. /// <param name="luaCommand">lua指令</param>
  65. public void ExecuteString(string luaCommand)
  66. {
  67. try
  68. {
  69. pLuaVM.DoString(luaCommand);
  70. }
  71. catch (Exception e)
  72. {
  73. MessageBox.Show(e.ToString());
  74. }
  75. }
  76. }
  77. }

我的LUA API类如下,用于实现C# for lua的函数(LuaAPI.cs)

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Windows;
  6. namespace WPFLuaFramework
  7. {
  8. class LuaAPI
  9. {
  10. [LuaFunction("lua1")]
  11. public void a1()
  12. {
  13. MessageBox.Show("a1 called");
  14. }
  15. [LuaFunction("lua2")]
  16. public int a2()
  17. {
  18. MessageBox.Show("a2 called");
  19. return 0;
  20. }
  21. [LuaFunction("lua3")]
  22. public void a3(string s)
  23. {
  24. MessageBox.Show("a3 called");
  25. }
  26. }
  27. }

最后看调用代码,是不是很简单

  1. LuaFramework test = new LuaFramework();
  2. test.BindLuaApiClass(new LuaAPI());
  3. test.ExecuteFile("test.lua");
  4. test.ExecuteString("lua1()");

LUA代码如下

lua1();
lua2();
lua3("test");

【转】封装Lua for C#的更多相关文章

  1. 封装Lua for C#

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

  2. spring boot:用redis+lua实现基于ip地址的分布式流量限制(限流/简单计数器算法)(spring boot 2.2.0)

    一,限流有哪些环节? 1,为什么要限流? 目的:通过对并发请求进行限速或者一个时间单位内的的请求进行限速,目的是保护系统可正常提供服务,避免被压力太大无法响应服务. 如果达到限制速率则可以采取预定的处 ...

  3. spring boot:用redis+lua实现表单接口的幂等性(spring boot 2.2.0)

    一,什么是幂等性? 1,幂等: 幂等操作:不管执行多少次,所产生的影响都和一次执行的影响相同. 幂等函数或幂等方法:可以使用相同的参数重复执行,并能获得相同的结果的函数/方法. 这些函数/方法不用担心 ...

  4. Unity3D游戏xlua轻量级热修复框架

    这是什么东西 前阵子刚刚集成xlua到项目,目的只有一个:对线上游戏C#逻辑有Bug的地方执行修复,通过考察了xlua和tolua,最终选择了xlua,原因如下: 1)项目已经到了后期,线上版本迭代了 ...

  5. Redisson实现分布式锁

    转: Redisson实现分布式锁 Redisson文档参考:https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95 redis是实现 ...

  6. Unity3D游戏轻量级xlua热修复框架

    Unity3D游戏轻量级xlua热修复框架   一 这是什么东西 前阵子刚刚集成xlua到项目,目的只有一个:对线上游戏C#逻辑有Bug的地方执行修复,通过考察xlua和tolua,最终选择了xlua ...

  7. C++实现对lua访问的封装

    这是一个几年前写的对lua的访问封装,当时的项目仅提供了最基本的lua访问接口:调用lua函数,向lua注册标准格式的C++函数. 本来我想引进luabind,但luabind相对又过于复杂,并不是所 ...

  8. lua面向对象封装及元表(metatable)性能测试

    Lua本身是没有面向对象支持的,但面向对象编程在逻辑复杂的大型工程却很有用.于是很多人用Lua本身的数据结构table来模拟面向对象.最简单的一种方法是把对象的方法.成员都放到table中.如: -- ...

  9. hiredis异步接口封装并导出到Lua

    hiredis异步接口封装并导出到Lua(金庆的专栏 2017.1)hiredis 不支持 Windows, Windows 下使用 wasppdotorg / hiredis-for-windows ...

随机推荐

  1. Mongodb基本操作说明

    Mongodb基本操作说明 1.首先cmd(管理员方式运行)下启动mongo服务(类似初始化工具): Mongod.exe 默认文件夹为 :c:\data\db 如果没有创建该文件夹的话,需要先创建该 ...

  2. Javascript基础知识总结一

    Javascript基础知识总结一 <!DOCTYPE html> <html> <head lang="en"> <meta chars ...

  3. Python开发程序:生产环境下实时统计网站访问日志信息

    日志实时分析系统 生产环境下有需求:要每搁五分钟统计下这段时间内的网站访问量.UV.独立IP等信息,用直观的数据表格表现出来 环境描述: 网站为Nginx服务,系统每日凌晨会对日志进行分割,拷贝到其他 ...

  4. Sass与Web组件化相关的功能

    Sass https://en.wikipedia.org/wiki/Sass_(stylesheet_language) Sass (Syntactically Awesome Stylesheet ...

  5. ASP.NET Identity - LockoutEnabled

    LockoutEnabled 并不是想象中的 用户是否 锁定. 而是 LockoutEnabled 标示 登陆是否此用户要检查 LockoutEndDateUtc字段. 如果为true则判断Locko ...

  6. Redis在Linux下的安装和启动和配置

    第一步:下载Redis安装包,下载版本:3.0.5 在所在目录右键打开终端输入命令: wget http://download.redis.io/releases/redis-3.0.5.tar.gz ...

  7. Fatal error: Call to undefined function curl_init()问题

    最近分别在win7和Win8.win10 上分别安装php 高版本!都遇到了这个问题! 一.win7系统, apache2.2/apache2.4, php5.2升级到5.4. 这个比较容易: 1. ...

  8. Android Activity 切换动画(非原创)

    在Android开发过程中,经常会碰到Activity之间的切换效果的问题,下面介绍一下如何实现左右滑动的切换效果,首先了解一下Activity切换的实现,从Android2.0开始在Activity ...

  9. Samba文件服务器详细配置步骤

    准备安装 环境:CentOS 6.3_x64bit 安装:Minimal(最小) 1.配置IP地址 2.挂载:[root@localhost ~]# mount -t iso9660 /dev/cdr ...

  10. cento下安装elasticsearch2.4.2小记

    1.首先需要安装好java,并配置好环境变量 2.下载elasticsearch的rpm包,命令如下: wget https://download.elastic.co/elasticsearch/r ...