天天看点

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:因为静态不属于特定对象