Lua 和 C#是通過一個開源技術LuaInterface進行互動的。
LuaInterface包含兩個核心類庫:LuaInterface.dll 和 Luanet.dll
C#通路Lua的代碼時:---依賴LuaInterface.dll
需要引入這兩個類庫(在C#項目中引用),然後建立Lua解釋器:Lua lua = new Lua( );
有兩個方法可以加載Lua代碼->lua.DoString( "lua語句") 和 lua.DoFile( "lua檔案絕對路徑")
C#通路Lua中的方法:
LuaState l = new LuaState();
l.DoString(Lua代碼); //把Lua代碼加載進Lua環境中
LuaFunction f = l.GetFunction( "luaFunc" );//luaFunc是Lua代碼中的方法名 相當于C#接收了Lua的方法
object[ ] r = f.Call( 傳遞參數即可 ); //傳回值用object數組去接收
print( r[0] );
使用完之後,需要手動調用 f.Dispose( )方法釋放掉垃圾記憶體。
Lua通路C#(Lua中使用C#中的類):---依賴Luanet.dll
========1》通過反射方式,主要有3大步驟:
①require "luanet" --先引入luanet.dll
②luanet.load_assembly( "System" ) --再加載C#中的動态連結庫dll(先引入dll) 或 自己的namespace,即程式集
③luanet.import_type( "System.Int32" ) --最後引傳入連結接庫中某個類(再引入類型)
在Lua中使用C#中的類型建立對象時,會自動比對最合适的構造方法。
========2》通過wrap映射方式,性能好(但是需要手動去WrapFile檔案填寫需要Wrap的檔案:_GT( typeof (需要Wrap的類 ) ))
當Lua虛拟機啟動的時候,會将wrap檔案加載進Lua虛拟機,然後Lua就可以識别wrap中的調用了,最後就形成了Lua調用Wrap,Wrap調用C#的模式,實作了Lua調用C#。這樣,就可以直接在Lua中使用C#的類及其方法了。
把一個C#類方法注冊進Lua的一個全局方法:(壓入虛拟棧中)
//把一個類中普通方法注冊進去
lua.RegisterFunction("LuaFun",obj,obj.GetType( ).GetMethod("NormalFun")); //LuaFun是注冊進Lua後的方法名,obj和第三個參數是把 哪個對象的哪個方法注冊進去
lua.DoString("LuaFun"); //調用
//把一個類中靜态方法注冊進去
lua.RegisterFunction("LuaStaticFun",null,typeof(classname).GetMethod("StaticFun"));//null:因為靜态不屬于特定對象