对Lua ,C,C#互相调用的理解

  • 几种情况讨论

  • C调用Lua
  • C调用C#
  • C#调用C
  • C#调用Lua
  • Lua调用C
  • Lua调用C#

Lua调用C

本质上是定义一个lua_CFunction,然后通过把关联到Lua中的一个table中,默认的比如lua_register,实际上是把这个函数关联到global表的对应key上,其他的也可以关联到自己定义的table上,比如:

  • lua_rawget 获取注册表中的table
  • lua_pushstring 导出的函数名
  • lua_pushcfunction,导出的函数
  • lua_rawset 设置关联
lua_pushstring(l,"export_table");
lua_rawget(l,LUA_REGISTRYINDEX);
if (lua_istable(l,-1))
{

    lua_pushstring(l,"function_name");
    lua_pushcfunction(l,lua_CFunction_define);
    // 相当于export_table[function_name] = lua_CFunction_define;
    lua_rawset(l,-3);
}
lua_pop(l, 1);

C调用Lua

通过lua_call和lua_pcall实现,先把函数压栈,这里的函数是在lua中的function,由于上面C函数可以关联到lua的某个table中,所以,理论上也可以是C函数,然后把返回结果再压栈。具体参数含义见API说明。

The following example shows how the host program can do the equivalent to this Lua code:

 a = f("how", t.x, 14)

Here it is in C:

 lua_getfield(L, LUA_GLOBALSINDEX, "f"); /* function to be called */
 lua_pushstring(L, "how");                        /* 1st argument */
 lua_getfield(L, LUA_GLOBALSINDEX, "t");   /* table to be indexed */
 lua_getfield(L, -1, "x");        /* push result of t.x (2nd arg) */
 lua_remove(L, -2);                  /* remove 't' from the stack */
 lua_pushinteger(L, 14);                          /* 3rd argument */
 lua_call(L, 3, 1);     /* call 'f' with 3 arguments and 1 result */
 lua_setfield(L, LUA_GLOBALSINDEX, "a");        /* set global 'a' */

Note that the code above is "balanced": at its end, the stack is back to its original configuration. This is considered good programming practice.

以上引用自官方
Manual

C#调用C

C#调用C的代码是通过P/invoke, 即平台调用,.net 提供了一种托管代码调用非托管代码的机制。
通过DllImport特性实现,把c的相关函数声明成 static, extern的形式,还可以为方法的参数和返回值指定自定义封送处理信息。

具体可以参考msdn的描述

C调用CS

C代码调用C#是通过delegate实现的,即把需要被调用的C#函数都声明成delegate,然后通过把函数地址通过DllImport已经导出的函数传入非托管代码(C代码),其中Marshal.GetFunctionPointerForDelegate可以获取函数指针。

有了上面的过程,下面的就好说了

C#调用Lua

C# --》C --》Lua

  • 把Lua相关的API,DLlIMPORT到C#
  • 把需要调用的Lua函数用上面导出的函数压栈
  • 调用导出的C#函数,pcall

Lua调用CS

Lua --》C --》C#, 以下部分代码摘自Slua

  • 把需要被调用的C#函数声明为delegate,由于Lua与C的通讯是通过lua_CFunction,所以这里我们声明的形式也要是一样的
public delegate int LuaCSFunction(IntPtr luaState);
  • 把Lua调用C相关的Lua API通过DllImport到C#,比如lua_pushcfunction
[DllImport(LUADLL, CallingConvention = CallingConvention.Cdecl)]
public static extern void lua_pushcclosure(IntPtr l, IntPtr f, int nup);

public static void lua_pushcclosure(IntPtr l, LuaCSFunction f, int nup)
{
    IntPtr fn = Marshal.GetFunctionPointerForDelegate(f);
    lua_pushcclosure(l, fn, nup);
}

  • 通过C#调用Lua的相关API,注册C#函数到Lua,与上面Lua调用C的注册过程是一样的
LuaDLL.lua_pushcfunction(L, print);
LuaDLL.lua_setglobal(L, "print");

print定义如下

static int print(IntPtr L)

以上就是C,C#,Lua互相调用的一个简单理解。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容

  • lua作为小巧精悍的脚本语言,易于嵌入c/c++中 , 广泛应用于游戏AI ,实际上在任何经常变化的逻辑上都可以使...
    木易林1阅读 1,501评论 0 4
  • 1. 写在前面 很多时候我们都需要借助一些脚本语言来为我们实现一些动态的配置,那么就会涉及到如何让脚本语言跟原生语...
    杰嗒嗒的阿杰阅读 3,429评论 9 31
  • 第一篇 语言 第0章 序言 Lua仅让你用少量的代码解决关键问题。 Lua所提供的机制是C不擅长的:高级语言,动态...
    testfor阅读 2,662评论 1 7
  • 第六章 证据是什么? 为什么如此多的写作和演说由一个又一个观点堆砌而成,而很少或根本就没有提供支持这些观点的证据?...
    露露黎阅读 339评论 0 0
  • 治保主任尴尬地示意小赵,"我媳妇。" 治保主任媳妇就不客气了,毕竟小赵抱的是她老公。 "你年纪轻轻的,找这么个老汉...
    tianguozheng阅读 318评论 0 0