一直以来对Lua热更新技术很感兴趣,在上周开始了对Lua的学习,主要学的是uLua。
直接上干货
准备工作:
LuaInterface包括两个核心库一个是LuaInterface.dll,一个是Luanet.dll,我们可以通过LuaInterface完成Lua和C#(CLR)之间的互相调用
需要在vs的工程中导入两个dll分别是LuaInterface.dll和luanet.dll,前者是vs调用lua时需要引用,并在vs的工程中引入命名空间using LuaInterface;引用以后就可以创建lua的解释器,来执行lua代码。
lua代码的脚本需要放在vs工程的输出环境下即E:vsworkspaceluainterfaceluainterfaceinDebug文件下。并且编码格式一定要是ANSI。UTF-8在编译时会出错。
luanet.dll是在lua脚本中调用vs的方法或变量时需要引入,require “luanet” 并且需要将该dll放在vs工程的输出环境下,即E:vsworkspaceluainterfaceluainterfaceinDebug文件下。
一、在C#中调用lua
1、在C#中执行lua代码。
1 Lua lua = new Lua(); //创建lua解释器 2 lua["num"] = 33; //定义一个num 3 lua["string"] = "Hello Lua "; //定义一个字符串 4 Console.WriteLine(lua["num"]); 5 Console.WriteLine(lua["string"]); 6 Console.ReadKey();
2、访问lua环境中的变量
double num = (double)lua["num"];
string str = (string)lua["str"];
说一下lua变量类型和c#中变量类型的对应
nil null
string System.String
number System.Double
boolean System.Boolean
table LuaInterface.LuaTable
Function LuaInterface.LuaFunction
3、在C#中执行Lua脚本文件,或者脚本字符串
1 Lua lua = new Lua(); //创建lua解释器 2 //lua.DoString("xxxxxxxxxx"); 里边写的字符串就相当于lua脚本中的代码 3 lua.DoString("num=2"); 4 lua.DoString("str = 'a string'"); 5 6 object[] strs = lua.DoString("return num,str"); 7 8 foreach (object item in strs) 9 { 10 Console.WriteLine(item); 11 }
1 Lua lua = new Lua(); //创建lua解释器 2 lua.DoFile("myLua.lua");//这个lua脚本需要放在vs的bin/debug文件夹下
4、把一个C#方法注册进Lua的一个全局方法
1 //把一个类中的普通方法注册进去 2 Program p = new Program(); 3 lua.RegisterFunction("LuaMethod", p, p.GetType().GetMethod("CLRMethod")); 4 lua.DoString("LuaMethod()");//执行这个方法 5 6 7 //把一个类的静态方法注册进去 8 lua.RegisterFunction("MyStaticMethod",null,typeof(Program).GetMethod("MyStaticMethod")) 9 lua.DoString(" MyStaticMethod()") //执行这个方法 10 11 12 public void CLRMethod() 13 { 14 Console.WriteLine("哈哈"); 15 } 16 17 public static void MyStaticMethod() 18 { 19 Console.WriteLine("这是静态方法"); 20 }
二、在Lua中使用c#中的类 这是lua中的代码
1 require "luanet" --请求连接 2 3 luanet.load_assembly("System") --load_assembly 加载程序集 4 luanet.load_assembly("testluainterface") 5 6 7 Int32 = luanet.import_type("System.Int32") --import_type 导入类型 8 Program = luanet.import_type("testluainterface.Program") 9 10 num = Int32.Parse("123456") 11 12 --print(Int32) 13 14 --print(num) 15 16 program1 = Program() --使用类型 17 18 --print(program1.name) --输出变量 19 --program1:TestMethod() --调用方法 20 21 --void, strlength = program1:TestOut("hahaha") --调用带有Out的方法 22 --print(void,strlength) --输出方法的返回值 和 out的返回值 C#的方法没有返回值这里也需要接收 会返回nil 23 void ,strlength = program1:TestRef("sahdjkhaskd",10) --调用带有Ref的方法 需要给ref传值 24 print(void,strlength) --输出方法的返回值 和 ref的返回值
lua脚本写好之后在C#中使用lua.DoFile("脚本的名字.lua")进行调用就会执行lua这个脚本即可。
在C#中对应的在Program类中的一些方法如下
1 public string name = "zhangli"; 2 3 public void TestMethod() 4 { 5 Console.WriteLine("TestMethod"); 6 } 7 8 public void TestOut(string name,out int count) 9 { 10 Console.WriteLine(name); 11 count = name.Length; 12 } 13 14 public void TestRef(string name,ref int count) 15 { 16 Console.WriteLine(name ); 17 Console.WriteLine(count); 18 count = name.Length; 19 }
三、在Lua中通过Add方法或者Remove方法把一个Lua的函数注册或者注销从C#中的事件委托中
3 function method() 4 5 end 6 7 obj.SomeEvent:Add(methodname(不用带引号))
根据学习进度今天分享这些基础内容。后续会继续学习。欢迎批评指正,共同学习。
欢迎广大博友加群学习165628892(进群备注:博客) 随时提出问题解决问题!
树欲静而风不止,子欲养而亲不待
2016年12月15日17:30:16