天天看點

Lua和C#互動

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:因為靜态不屬于特定對象