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 ...
随机推荐
- 五分钟学习React(一): 什么是React
在前端的世界里,我们要处理的文件不是太多,而是太少.每天开发项目将html.css.js.图片.字体文件都像大杂烩一般加载都网页上.当应用变得越来越臃肿的时候,会发现js用了那么多全局变量,css的继 ...
- 统计学习方法学习(四)--KNN及kd树的java实现
K近邻法 1基本概念 K近邻法,是一种基本分类和回归规则.根据已有的训练数据集(含有标签),对于新的实例,根据其最近的k个近邻的类别,通过多数表决的方式进行预测. 2模型相关 2.1 距离的度量方式 ...
- MongoDB的安装与配置
一.安装包安装: 1.安装 #1.安装路径为D:\MongoDB,将D:\MongoDB\bin目录加入环境变量 #2.新建目录与文件D:\MongoDB\data\dbD:\MongoDB\log\ ...
- 我们编写 React 组件的最佳实践
刚接触 React 的时候,在一个又一个的教程上面看到很多种编写组件的方法,尽管那时候 React 框架已经相当成熟,但是并没有一个固定的规则去规范我们去写代码. 在过去的一年里,我们在不断的完善我们 ...
- HDU 1495 非常可乐(数论,BFS)
非常可乐 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- A. Duff and Meat
A. Duff and Meat time limit per test 1 second memory limit per test 256 megabytes input standard inp ...
- the quick brown fox jumps over the lazy dog
THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG
- Spring配置集群定时任务
正常配置定时任务的时候配置定时任务调度工厂的代码如下 <bean id="" class="org.springframework.scheduling.quart ...
- TI-RTOS 之 事件同步(Event, 类似semaphore)
TI-RTOS 之 事件同步(Event, 类似semaphore) Event 是类似Semaphore的存在,官方如下描述: SYS/BIOS events are a means of comm ...
- 微信小程序实现淡入淡出效果(页面跳转)
//目前小程序没有fadeIn(),fadeOut()方法所以还是本方法手写 <!--wxml--><!--蒙版(渐出淡去效果)--><view class=" ...