【转】封装Lua for C#
原文: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");
【转】封装Lua for C#的更多相关文章
- 封装Lua for C#
http://blog.csdn.net/rcfalcon/article/details/5583095
- spring boot:用redis+lua实现基于ip地址的分布式流量限制(限流/简单计数器算法)(spring boot 2.2.0)
一,限流有哪些环节? 1,为什么要限流? 目的:通过对并发请求进行限速或者一个时间单位内的的请求进行限速,目的是保护系统可正常提供服务,避免被压力太大无法响应服务. 如果达到限制速率则可以采取预定的处 ...
- spring boot:用redis+lua实现表单接口的幂等性(spring boot 2.2.0)
一,什么是幂等性? 1,幂等: 幂等操作:不管执行多少次,所产生的影响都和一次执行的影响相同. 幂等函数或幂等方法:可以使用相同的参数重复执行,并能获得相同的结果的函数/方法. 这些函数/方法不用担心 ...
- Unity3D游戏xlua轻量级热修复框架
这是什么东西 前阵子刚刚集成xlua到项目,目的只有一个:对线上游戏C#逻辑有Bug的地方执行修复,通过考察了xlua和tolua,最终选择了xlua,原因如下: 1)项目已经到了后期,线上版本迭代了 ...
- Redisson实现分布式锁
转: Redisson实现分布式锁 Redisson文档参考:https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95 redis是实现 ...
- Unity3D游戏轻量级xlua热修复框架
Unity3D游戏轻量级xlua热修复框架 一 这是什么东西 前阵子刚刚集成xlua到项目,目的只有一个:对线上游戏C#逻辑有Bug的地方执行修复,通过考察xlua和tolua,最终选择了xlua ...
- C++实现对lua访问的封装
这是一个几年前写的对lua的访问封装,当时的项目仅提供了最基本的lua访问接口:调用lua函数,向lua注册标准格式的C++函数. 本来我想引进luabind,但luabind相对又过于复杂,并不是所 ...
- lua面向对象封装及元表(metatable)性能测试
Lua本身是没有面向对象支持的,但面向对象编程在逻辑复杂的大型工程却很有用.于是很多人用Lua本身的数据结构table来模拟面向对象.最简单的一种方法是把对象的方法.成员都放到table中.如: -- ...
- hiredis异步接口封装并导出到Lua
hiredis异步接口封装并导出到Lua(金庆的专栏 2017.1)hiredis 不支持 Windows, Windows 下使用 wasppdotorg / hiredis-for-windows ...
随机推荐
- TweenMax学习一
TweenMaxjs是一个性能很高的js动画框架,它与css3动画具有时间轴的概念.你可以很方便的把动画添加到一个时间轴队列里面去按照你需要的顺序去执行. 官网地址: http://greensock ...
- 原生js封装Ajax
[转载请注明出处] 1 /** * @fileoverview ajax请求公用组件 * @author Limo * @date 2015/08/07 * Native package ajax m ...
- 给div加上背景图片
<div class="panel-body" style="background:url('pages/upload/brief/img/bg.jpg');bac ...
- java关键字之final
final表示不能修改. final修饰的方法不能被重写, final修饰的类不能被继承并且类里的所有方法都是final,成员变量可以是final或者不是final. final修饰的成员变量不可以改 ...
- MySQL 显示命令
虽然现在各种图形化管理工具方便了MySQL的管理,但是偶尔还是需要手动输入指令来使用比较方便,以下是摘抄的一些命令,供自己备忘使用. 1.显示数据库列表. show databases; 2.显示库中 ...
- Jenkins搭建的几个坑记下
坑一 安装cobertura插件后,一定要在工程代码的pom.xml文件里添加如下插件配置: <plugin> <groupId>org.codehaus.mojo</g ...
- GPS部标监控平台的架构设计(十一)-基于Memcached的分布式Gps监控平台
部标gps监控平台的架构,随着平台接入的车辆越来越多,架构也面临越来越大的负载挑战,我们当然希望软件尽可能的优化并能够接入更多的车辆,减少在硬件上的投资.但是当车辆增多到某一个临界点的时候,仍然要面临 ...
- HDU 5053 the Sum of Cube(简单数论)
http://acm.hdu.edu.cn/showproblem.php?pid=5053 题目大意: 求出A^3+(A+1)^3+(A+2)^3+...+B^3和是多少 解题思路: 设f(n)=1 ...
- php判断是否为微信浏览器访问
今天遇到个问题,就是需要判断是否在微信浏览器内访问: if (strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false) { ...
- JS/JQ获取各种屏幕的高度和宽度
Javascript: 网页可见区域宽: document.body.clientWidth网页可见区域高: document.body.clientHeight网页可见区域宽: document.b ...