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

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

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

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

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

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

http://blog.csdn.net/kenkao/article/details/10108249

注册c#函数到lua相关推荐

  1. java类sample是公共的_应在名samle.java的文件_Andoid NDK编程 1 - 注册native函数

    打算对Android的NDK的开发做一总结,首先是JNI部分,接下来是NDK的内容.今天首先介绍一下JNI的第一部分:注册native函数. 当java代码中执行native的代码时候,首先是通过一定 ...

  2. C语言 sigaction函数捕捉信号 注册回调函数

    // ..使用内存映射可以拷贝文件 /* 对原始文件进行内存映射 创建一个新文件 把新文件的数据拷贝映射到内存中 通过内存拷贝将第一个文件的内存映射区拷贝到第二个文件的内存映射区 释放资源 */// ...

  3. c语言函数注册与回调,在C中注册回调函数是什么意思?

    谁能告诉我在C中注册一些示例的回调函数的确切含义? 我在网上进行了很多搜索,但找不到满意的答案. 甚至在堆栈溢出中进行搜索,但都无法获得完美的想法. 什么是通知回调和异步回叫? C中什么是" ...

  4. 【若泽大数据实战第十九天】Hive 函数UDF开发以及永久注册udf函数

    前言: 回顾上期课程,上次课我们讲了聚合函数,多进一出, 分组函数  group by,出现在select里面的字段除了分组函数之外,其他都要出现在group by里面,分组函数的过滤必须使用hivi ...

  5. Hive 函数UDF开发以及永久注册UDF函数

    explode: (把一串数据转换成多行的数据) 创建一个文本: [hadoop@ruozehadoop000 data]$ vi hive-wc.txt hello,world,welcome he ...

  6. Android逆向之旅---抖音短视频的Native注册混淆函数获取方法

    一.静态分析 最近在小密圈中有很多同学都在咨询有时候有些应用的动态注册Native函数,在分析so之后发现找不到真的实现函数功能地方,我们知道有时候为了安全考虑会动态注册Native函数,但是如果只是 ...

  7. c语言注册回调函数主要用途,C语言回调函数的概念及其应用

    笔者能力有限,如果文中有错误的地方,欢迎各位朋友给我及时地指出来,我将不甚感激,谢谢~ 概念 引用维基百科上的关于回调函数的概念:在计算机程序设计中,回调函数,或简称回调(Callback 即call ...

  8. cocos2dx中node的pause函数(lua)

    time:2015/05/14 描述 lua下使用node的pause函数想暂停layer上的所有动画,结果没有效果 1. pause函数 (1)cc.Node:pause 代码: void Node ...

  9. 一种注册表沙箱的思路、实现——研究Reactos中注册表函数的实现2

    上一篇博文中主要介绍了Reactos中大部分函数的思路和HKEY和HANDLE之间的关系,本文将介绍一些Reactos中有意思的函数和存在bug的函数.(转载请指明出处) CreateNestedKe ...

  10. 一种注册表沙箱的思路、实现——研究Reactos中注册表函数的实现1

    因为我们沙箱注入了一个DLL到了目标进程,并且Hook了一系列NtXX(NtOpenKey)函数,所以我们在注入的代码中是不能使用RegXX(RegOpenKey等)这类函数的.因为RegXX系列函数 ...

最新文章

  1. AD633低成本模拟乘法器
  2. [导入]连连看.NET 1.41全部源码
  3. android小闹钟程序,Android实现闹钟小程序.pdf
  4. 机器学习实战(二)——k-近邻算法
  5. virtualbox 采用 NAT 还是 BRIDGE
  6. [渝粤教育] 西南科技大学 形式逻辑 在线考试复习资料
  7. Java—switch case实现两个数的算术运算
  8. ASP.NET中Server.MapPath() 和Request.MapPath()使用
  9. 针对github权限导致hexo部署失败的解决方案
  10. RTX——第13章 事件标志组
  11. office Word中手动添加MathType插件
  12. 美国黄岩超级计算机,飓风预测 揭秘最快气候研究“黄石”超算
  13. html显示doc内容,doc文件怎么打开?doc是什么文件?
  14. mysql 1556_mysqldump: Got error: 1556: You can't use locks with log tables
  15. myeclipse 百度云
  16. 云服务器对比虚拟主机,云服务器对比虚拟主机
  17. Java学习——生产者-消费者模式与线程通信问题(管程法、信号灯法)
  18. 颜色所代表的人的性格
  19. 邮件营销怎么做你知道吗?电子邮件营销平台注册流程
  20. 【电子电路计算公式】 导线流过电流计算工具,我已经做成一个小工具了(源代码)

热门文章

  1. linux查询主板时间,linux怎么查看硬件时间
  2. 你我皆楚门:刷脸支付这把火是如何燃起来的?
  3. 计算机毕业设计 SSM疫情下医院门诊就医管理系统(源码+论文)
  4. Java设计模式--模板模式
  5. 内蒙师大计算机专业,2017年内蒙古师范大学专业排名
  6. android 5.0 谷歌服务,原生Android 5.0系统 超顺畅丝滑体验
  7. 【学习笔记2】get与post请求对象的定制
  8. 【推荐】开源动态配置ares服务让业务飞起来,”赶超nacos、apollo,从此不再依靠 spring cloud config“
  9. 小白用AI写爆文,公众号流量主变现攻略!
  10. 一个2000年开始做网络支付的人,被apple和腾讯的支付系统坑了一把