欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
對Lua ,C,C#互相調用的理解
  • 幾種情況討論

  • C調用Lua
  • C調用C#
  • C#調用C
  • C#調用Lua
  • Lua調用C
  • Lua調用C#

Lua調用C

本質(zhì)上是定義一個(gè)lua_CFunction,然后通過(guò)把關(guān)聯(lián)到Lua中的一個(gè)table中,默認的比如lua_register,實(shí)際上是把這個(gè)函數關(guān)聯(lián)到global表的對應key上,其他的也可以關(guān)聯(lián)到自己定義的table上,比如:

  • lua_rawget 獲取注冊表中的table
  • lua_pushstring 導出的函數名
  • lua_pushcfunction,導出的函數
  • lua_rawset 設置關(guān)聯(lián)
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

通過(guò)lua_call和lua_pcall實(shí)現,先把函數壓棧,這里的函數是在lua中的function,由于上面C函數可以關(guān)聯(lián)到lua的某個(gè)table中,所以,理論上也可以是C函數,然后把返回結果再壓棧。具體參數含義見(jiàn)API說(shuō)明。

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的代碼是通過(guò)P/invoke, 即平臺調用,.net 提供了一種托管代碼調用非托管代碼的機制。
通過(guò)DllImport特性實(shí)現,把c的相關(guān)函數聲明成 static, extern的形式,還可以為方法的參數和返回值指定自定義封送處理信息。

具體可以參考msdn的描述

C調用CS

C代碼調用C#是通過(guò)delegate實(shí)現的,即把需要被調用的C#函數都聲明成delegate,然后通過(guò)把函數地址通過(guò)DllImport已經(jīng)導出的函數傳入非托管代碼(C代碼),其中Marshal.GetFunctionPointerForDelegate可以獲取函數指針。

有了上面的過(guò)程,下面的就好說(shuō)了

C#調用Lua

C# --》C --》Lua

  • 把Lua相關(guān)的API,DLlIMPORT到C#
  • 把需要調用的Lua函數用上面導出的函數壓棧
  • 調用導出的C#函數,pcall

Lua調用CS

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

  • 把需要被調用的C#函數聲明為delegate,由于Lua與C的通訊是通過(guò)lua_CFunction,所以這里我們聲明的形式也要是一樣的
public delegate int LuaCSFunction(IntPtr luaState);
  • 把Lua調用C相關(guān)的Lua API通過(guò)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);}
  • 通過(guò)C#調用Lua的相關(guān)API,注冊C#函數到Lua,與上面Lua調用C的注冊過(guò)程是一樣的
LuaDLL.lua_pushcfunction(L, print);LuaDLL.lua_setglobal(L, "print");

print定義如下

static int print(IntPtr L)

以上就是C,C#,Lua互相調用的一個(gè)簡(jiǎn)單理解。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
為劍三做準備:學(xué)習LUA語(yǔ)言——Lua 語(yǔ)言的簡(jiǎn)單介紹 - 綜合討論區 - 劍俠情緣網(wǎng)絡(luò )版...
lua跟c++/c交互
Lua和C 交互詳細總結
C++返回table給lua
lua和c的交互(轉)
在你的游戲中應用LUA
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久