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 ...
随机推荐
- 利用TortoiseGit对Coding项目进行版本管理
Git配置: 1),首先去Git官网下载最新的Git,https://git-for-windows.github.io/ 2),下载对应的版本,然后一路next点击安装. Git与Coding联通 ...
- npm 简单实用命令
npm -v 查看版本号 npm get global 返回false表示默认本地安装 true全局安装 npm set global=true 设置默认为全局安 ...
- 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](五)
前言 Hi,大家好,我是Rector 时间飞逝,一个星期又过去了,今天还是星期五,Rector在图享网继续跟大家分享系列文本:一步一步创建ASP.NET MVC5程序[Repository+Autof ...
- 2017 年“认证杯”数学中国数学建模网络挑战赛 C题思路讲解
之前有小伙伴私信我叫我说说这次比赛C题的思路,怎么写的,我就写篇博客说说吧,仅供参考! 针对C题,该题目比较综合,是一个成熟的数模赛题,与国赛的相似性较高.一般而言,第一问难度较低,题目要求进行数据挖 ...
- 渗透测试入门DVWA 教程1:环境搭建
首先欢迎新萌入坑.哈哈.你可能抱着好奇心或者疑问.DVWA 是个啥? DVWA是一款渗透测试的演练系统,在圈子里是很出名的.如果你需要入门,并且找不到合适的靶机,那我就推荐你用DVWA. 我们通常将演 ...
- UVA 10881 - Piotr's Ants【模拟+思维】
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- HDU-1013九余数定理
题目传送门:HDU1013 九余数定理 //题目描述:给定一个数,要求你求出它的每位上的数字之和,并且直到每位上的数字之和为个位时候输出它 //输入:一个整数 //输出:题目描述的结果 //算法分析: ...
- JS 监听浏览器各个标签间的切换
以前看到过一些网页,在标签切换到其它地址时,网页上的标题上会发生变化,一直不知道这个是怎么做的,最近查了一些资料才发现有一个 visibilitychange 事件就可以搞定,这里将介绍一下页面可见性 ...
- C# 构造器总结
在C#中,构造器分为实例构造器和类型构造器, 一.实例构造器 构造引用类型的对象时,在调用实例 构造器之前,为对象分配的内存总是归0,没有被构造器显示重写的字段都保证获得0或null的值 在一个类中, ...
- 在jquery中防止ajax重复提交