ulua c#调用lua中模拟的类成员函数
项目使用ulua,我神烦这个东西。lua单纯在lua环境使用还好,一旦要跟外界交互,各种月经不调就来了。要记住贼多的细节,你才能稍微处理好。一个破栈,pop来push去,位置一会在-1,一会在-3,21世纪已经过去五分之一了好吗,谁乐意像汇编一样操作?那十几个操作函数,愣是比正则表达式规则还难记,用完就忘。我发现lua心智负担完全跟简洁搭不上边,贼他娘重,实现个面向对象都乱七八糟。我学c++都没觉得有什么不爽的,就lua代码各种不乐意看,各种小tips在那里,什么meta,weak,_G,逼着你记得各种trick,或者好听点,叫做元搭建。Fuck,怎么不去死。用lua这类小众语言就像用linux的工具,某种意义上,它们其实也容易形成一种壁垒,我管这叫他奶奶的细节地狱。老子想来场说走就走的旅行,你给我一袋工具,先组装一个自行车先,你是从清朝穿越来搞笑的吗?
哥哥只是想c#调个lua模拟的类,折腾的不得不去看细节,顺带又回忆了programing in lua 24-26章。lua遇到unity,就像王八遇到乌龟,真是极品配极品。unity单看是极好的,咋就遇到热更新这种屁事呢。
哇塞,戾气好重,还是先上代码吧。
以下2个函数添加到LuaScriptMgr,LuaFunction,就可以调用lua中实现的类似fuckmodule:overridefuck()的函数了。
public object[] CallLuaModuleFunction(string name, params object[] args)
{
LuaBase lb = null; if (dict.TryGetValue(name, out lb))
{
LuaFunction func = lb as LuaFunction;
return func.Call(args);
}
else
{
IntPtr L = lua.L;
LuaFunction func = null;
int oldTop = LuaDLL.lua_gettop(L); bool error = false; int pos = name.LastIndexOf('.'); if (pos > )
{
string tableName = name.Substring(, pos); if (PushLuaTable(L, tableName))
{
string funcName = name.Substring(pos + );
LuaDLL.lua_pushstring(L, funcName);
LuaDLL.lua_gettable(L, -);
} LuaTypes type = LuaDLL.lua_type(L, -); if (type != LuaTypes.LUA_TFUNCTION)
{
LuaDLL.lua_settop(L, oldTop);
error = true;
}
}
else
{
LuaDLL.lua_getglobal(L, name);
LuaTypes type = LuaDLL.lua_type(L, -); if (type != LuaTypes.LUA_TFUNCTION)
{
LuaDLL.lua_settop(L, oldTop);
error = true;
}
} if (!error)
{
int reference = LuaDLL.luaL_ref(L, LuaIndexes.LUA_REGISTRYINDEX);
func = new LuaFunction(reference, lua);
//LuaDLL.lua_settop(L, oldTop);
object[] objs = func.CallMember(args);
func.Dispose();
return objs;
} return null;
}
}
internal object[] callmember(object[] args, Type[] returnTypes)
{
int nArgs = ;
LuaScriptMgr.PushTraceBack(L);
int oldTop = LuaDLL.lua_gettop(L); if (!LuaDLL.lua_checkstack(L, args.Length + ))
{
LuaDLL.lua_pop(L, );
throw new LuaException("Lua stack overflow");
} push(L); LuaDLL.lua_pushvalue(L, -); //推入this即函数所在的表本身,-1是函数,-2是错误处理函数,-3是函数所在的表 if (args != null)
{
nArgs = args.Length; for (int i = ; i < args.Length; i++)
{
PushArgs(L, args[i]);
}
} int error = LuaDLL.lua_pcall(L, nArgs + , -, -nArgs - ); if (error != )
{
string err = LuaDLL.lua_tostring(L, -);
LuaDLL.lua_settop(L, oldTop - );
if (err == null) err = "Unknown Lua Error";
throw new LuaScriptException(err, "");
} object[] ret = returnTypes != null ? translator.popValues(L, oldTop, returnTypes) : translator.popValues(L, oldTop);
LuaDLL.lua_settop(L, oldTop - );
return ret;
}
ulua c#调用lua中模拟的类成员函数的更多相关文章
- 简述C/C++调用lua中实现的自定义函数
1.首先说下目的,为什么要这么做 ? 正式项目中,希望主程序尽量不做修改,于是使用C/C++完成功能的主干(即不需要经常变动的部分)用lua这类轻量级的解释性语言实现一些存在不确定性的功能逻辑:所以, ...
- 理解ATL中的一些汇编代码(通过Thunk技术来调用类成员函数)
我们知道ATL(活动模板库)是一套很小巧高效的COM开发库,它本身的核心文件其实没几个,COM相关的(主要是atlbase.h, atlcom.h),另外还有一个窗口相关的(atlwin.h), 所以 ...
- 直接调用类成员函数地址(用汇编取类成员函数的地址,各VS版本还有所不同)
在C++中,成员函数的指针是个比较特殊的东西.对普通的函数指针来说,可以视为一个地址,在需要的时候可以任意转换并直接调用.但对成员函数来说,常规类型转换是通不过编译的,调用的时候也必须采用特殊的语法. ...
- c++空指针调用类成员函数
最近在看C++动态绑定问题时(理解静态绑定时)发现的问题:能用空指针调用类的成员函数(gcc,vs2013下都可以). 例子: class animal { public: void sleep(){ ...
- 深入理解类成员函数的调用规则(理解成员函数的内存为什么不会反映在sizeof运算符上、类的静态绑定与动态绑定、虚函数表)
本文转载自:http://blog.51cto.com/9291927/2148695 总结: 一.成员函数的内存为什么不会反映在sizeof运算符上? 成员函数可以被看作是类 ...
- C++中 线程函数为静态函数 及 类成员函数作为回调函数
线程函数为静态函数: 线程控制函数和是不是静态函数没关系,静态函数是在构造中分配的地址空间,只有在析构时才释放也就是全局的东西,不管线程是否运行,静态函数的地址是不变的,并不在线程堆栈中static只 ...
- boost::function 通过boost::bind调用类成员函数
1. 首先引用boost::function和boost::bind的头文件和库: #include "boost/bind.hpp" #include "boost/f ...
- 不能调用jquery中ready里面定义的函数?
现象:不能调用jquery中ready里面定义的函数 源码:<script type="text/javascript"> $(document).ready(func ...
- ### C++总结-[类成员函数]
C++类中的常见函数. #@author: gr #@date: 2015-07-23 #@email: forgerui@gmail.com 一.constructor, copy construc ...
随机推荐
- AWS上获取监控数据(EC2/RDS都支持)
方法1:mon-cmd http://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/cli/SetupCLI.html(安装连接) ● Step ...
- .Net程序员学用Oracle系列:视图、函数、存储过程、包
1.视图 在实际操作过程中,本人发现 Oracle 视图定义有一个缺陷,就是不大方便注释,每次写好的注释执行之后再打开视图定义所有注释就全都没了.后来我发现把注释写到末尾就不会被清除,但这样总感觉乖乖 ...
- 51 NOD 1238 最小公倍数之和 V3
原题链接 最近被51NOD的数论题各种刷……(NOI快到了我在干什么啊! 然后发现这题在网上找不到题解……那么既然A了就来骗一波访问量吧…… (然而并不怎么会用什么公式编辑器,写得丑也凑合着看吧…… ...
- Vijos P1785 同学排序【模拟】
同学排序 描述 现有m位同学,第1位同学为1号,第2位同学为2号,依次第m位同学为m号.要求双号的学生站出来,然后余下的重新组合,组合完后,再次让双号的学生站出来,重复n次,问这时有多少同学出来站着? ...
- A. Two Bases
A. Two Bases time limit per test 1 second memory limit per test 256 megabytes input standard input o ...
- A. Vasya and Football
A. Vasya and Football time limit per test 2 seconds memory limit per test 256 megabytes input standa ...
- mysql 恢复数据
前提:保存了需要恢复数据库的文件 .frm 和 .ibd 文件 条件:InnoDB 类型的 恢复表结构1.新建一个数据库--新建一个表,表名和列数和需要恢复数据库相同2.停止mysql服务器 serv ...
- 在tomcat中布置项目的介绍(一)
一:为什么要在tomcat中单独布置项目 因为上线到服务器上需要项目的功能之间彼此独立,这个以后我会细说. 二:简单的步骤一个都不能少 conf文件里的配置文件需要配置好:logback.xml文件会 ...
- POJ 3829 Seat taking up is tough(——只是题目很长的模拟)
题目链接: http://poj.org/problem?id=3829 题意描述: 输入矩阵的大小n和m,以及来占位置的人数k 输入n*m的教室座位矩阵,每个值表示该座位的满意度 输入每个人来占位置 ...
- Spark高可用集群搭建
Spark高可用集群搭建 node1 node2 node3 1.node1修改spark-env.sh,注释掉hadoop(就不用开启Hadoop集群了),添加如下语句 export ...