项目使用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中模拟的类成员函数的更多相关文章

  1. 简述C/C++调用lua中实现的自定义函数

    1.首先说下目的,为什么要这么做 ? 正式项目中,希望主程序尽量不做修改,于是使用C/C++完成功能的主干(即不需要经常变动的部分)用lua这类轻量级的解释性语言实现一些存在不确定性的功能逻辑:所以, ...

  2. 理解ATL中的一些汇编代码(通过Thunk技术来调用类成员函数)

    我们知道ATL(活动模板库)是一套很小巧高效的COM开发库,它本身的核心文件其实没几个,COM相关的(主要是atlbase.h, atlcom.h),另外还有一个窗口相关的(atlwin.h), 所以 ...

  3. 直接调用类成员函数地址(用汇编取类成员函数的地址,各VS版本还有所不同)

    在C++中,成员函数的指针是个比较特殊的东西.对普通的函数指针来说,可以视为一个地址,在需要的时候可以任意转换并直接调用.但对成员函数来说,常规类型转换是通不过编译的,调用的时候也必须采用特殊的语法. ...

  4. c++空指针调用类成员函数

    最近在看C++动态绑定问题时(理解静态绑定时)发现的问题:能用空指针调用类的成员函数(gcc,vs2013下都可以). 例子: class animal { public: void sleep(){ ...

  5. 深入理解类成员函数的调用规则(理解成员函数的内存为什么不会反映在sizeof运算符上、类的静态绑定与动态绑定、虚函数表)

    本文转载自:http://blog.51cto.com/9291927/2148695 总结: 一.成员函数的内存为什么不会反映在sizeof运算符上?             成员函数可以被看作是类 ...

  6. C++中 线程函数为静态函数 及 类成员函数作为回调函数

    线程函数为静态函数: 线程控制函数和是不是静态函数没关系,静态函数是在构造中分配的地址空间,只有在析构时才释放也就是全局的东西,不管线程是否运行,静态函数的地址是不变的,并不在线程堆栈中static只 ...

  7. boost::function 通过boost::bind调用类成员函数

    1. 首先引用boost::function和boost::bind的头文件和库: #include "boost/bind.hpp" #include "boost/f ...

  8. 不能调用jquery中ready里面定义的函数?

    现象:不能调用jquery中ready里面定义的函数 源码:<script type="text/javascript"> $(document).ready(func ...

  9. ### C++总结-[类成员函数]

    C++类中的常见函数. #@author: gr #@date: 2015-07-23 #@email: forgerui@gmail.com 一.constructor, copy construc ...

随机推荐

  1. 关于python使用cv画矩形并填充颜色同时填充文字

    font = cv2.FONT_HERSHEY_SIMPLEX # 使用默认字体 cv2.rectangle(im, (10, 10), (110, 110), (0, 0, 255), thickn ...

  2. python数据处理之基本函数

    一.基本函数篇 1)python strip()函数介绍 函数原型 声明:s为字符串,rm为要删除的字符序列 s.strip(rm) 删除s字符串中开头.结尾处,位于 rm删除序列的字符 s.lstr ...

  3. Timus Online Judge:ural:1006. Square Frames

    原题链接:http://acm.timus.ru/problem.aspx?space=1&num=1006 看到题第一反应:这玩意怎么读入…… 本地的话因为是全角字符,会占两个位置,所以需要 ...

  4. 喵哈哈村的魔法考试 Round #1 (Div.2) 题解&源码(A.水+暴力,B.dp+栈)

    A.喵哈哈村的魔法石 发布时间: 2017年2月21日 20:05   最后更新: 2017年2月21日 20:06   时间限制: 1000ms   内存限制: 128M 描述 传说喵哈哈村有三种神 ...

  5. DFS中的奇偶剪枝学习笔记

    奇偶剪枝学习笔记 描述 编辑 现假设起点为(sx,sy),终点为(ex,ey),给定t步恰好走到终点, s | | | + — — — e 如图所示(“|”竖走,“—”横走,“+”转弯),易证abs( ...

  6. HDU 1014 Uniform Generator【GCD,水】

    Uniform Generator Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  7. 浅析const、let与var

    以前无论声明变量还是常量,总是使用var一勺端,知道接触了es6之后,发现原来变量.常量的声明其实是很讲究的. 这里简单来谈谈var.const与let. 1.var.var声明的变量没有块级作用域, ...

  8. Document类型知识大全

    Document类型 1.文档的子节点  Document类型可以表示HTML页面或者其他基于XML的文档.不过,最常见的应用还是作为HTMLDocument实例的document对象.通过这个文档对 ...

  9. JavaScript八张思维导图

    JS基本概念 JS操作符 JS基本语句 JS数组用法 Date用法 JS字符串用法 JS编程风格 JS编程实践 不知不觉做前端已经五年多了,无论是从最初的jQuery还是现在火热的Angular,Vu ...

  10. Python scrapy------分类获取美团整站数据

    欢迎联系讨论:qq:1170370113 以下是我们获取美团页面的城市信息 获取到了城市信息以后我们可以进行分类保存,以便于后续能够分类获取数据 获取我们需要城市的景区的所有相关id并且进行保存 最后 ...