参考链接:
https://www.cnblogs.com/chinarbolg/p/9601452.html
luainterface下载(推荐用1.5.3):
http://files.luaforge.net/releases/luainterface/luainterface
0.准备
下载好luainterface后解压,打开Built文件夹,里面的3个dll后面会用到
创建一个c#控制台项目,添加引用,选择上面的LuaInterface.dll。然后将上面的lua51.dll和luanet.dll复制到项目中的bin\Debug目录下
1.创建lua解释器
1 using LuaInterface; 2 using System; 3 4 namespace TestLua 5 { 6 class Program 7 { 8 static void Main(string[] args) 9 { 10 Lua lua = new Lua(); //创建一个lua解释器 11 lua["num"] = 66; //用C#脚本在lua环境中,创建一个变量 12 lua["str"] = "chinar"; //用C#脚本在lua环境中,创建一个字符串变量 13 Console.WriteLine(lua["num"]); //输出 14 Console.WriteLine(lua["str"]); //输出 15 Console.ReadKey(); //等待输入 16 } 17 } 18 }
输出:
2.执行lua代码段(lua.DoString)
1 using LuaInterface; 2 using System; 3 4 namespace TestLua 5 { 6 class Program 7 { 8 static void Main(string[] args) 9 { 10 Lua lua = new Lua(); //创建一个lua解释器 11 lua.DoString("num=666"); //用C#脚本在lua环境中,创建一段lua脚本:num=666 12 lua.DoString("str='chianr666'"); //用C#脚本在lua环境中,创建一段lua脚本:str='chianr666' 13 object[] values = lua.DoString("return num,str"); //用一个object数组 去接受返回值 14 foreach (var value in values) //遍历 values 数组中的元素 15 { 16 Console.WriteLine(value); //输出 17 } 18 Console.ReadKey(); //等待输入 19 } 20 } 21 }
输出:
3.执行lua代码文件(lua.DoFile)
1 using LuaInterface; 2 using System; 3 4 namespace TestLua 5 { 6 class Program 7 { 8 static void Main(string[] args) 9 { 10 Lua lua = new Lua(); //创建一个lua解释器 11 lua.DoFile("test.lua"); //加载lua文件 —— lua.DoFile(文件名) 12 Console.ReadKey(); //等待输入 13 } 14 } 15 }
test.lua
1 print('I am Chianr') 2 MyTable={1,22,333,4444,55555,666666} 3 print(table.concat(MyTable)..'I am Chianr')
注意要将上面的lua文件拖到项目根目录中,并且修改属性如下,这样lua文件才能被识别到
输出:
4.将c#的方法注册到lua中,供lua调用(lua.RegisterFunction)
1 using LuaInterface; 2 using System; 3 4 namespace TestLua 5 { 6 class Program 7 { 8 static void Main(string[] args) 9 { 10 Lua lua = new Lua(); //创建一个lua解释器 11 Program program = new Program(); //声明一个对象 12 13 //lua.RegisterFunction 注册方法(注册到Lua中以后方法的名称,程序对象,程序的类型program.GetType().(传入C#中的方法名:需要是公有方法)) 14 lua.RegisterFunction("LuaChinarTest", program, program.GetType().GetMethod("ChinarTest")); 15 //然后用lua.DoString(Lua中方法名())调用测试 16 lua.DoString("LuaChinarTest()"); 17 18 //lua.RegisterFunction 注册静态方法(注册到Lua中以后方法的名称,空,程序的类型 typeof(Program).(传入C#中的方法名:需要是公有方法)) 19 lua.RegisterFunction("LuaChinarStaticTest", null, typeof(Program).GetMethod("ChinarStaticTest")); 20 //然后用lua.DoString(Lua中静态方法名())调用测试 21 lua.DoString("LuaChinarStaticTest()"); 22 23 Console.ReadKey(); //等待输入 24 } 25 26 ///27 /// 一个测试方法 28 /// 29 public void ChinarTest() 30 { 31 Console.WriteLine("这是一个空方法"); 32 } 33 34 /// 35 /// 一个静态测试方法 36 /// 37 public static void ChinarStaticTest() 38 { 39 Console.WriteLine("这个一个静态空方法"); 40 } 41 } 42 }
输出:
5.lua调用c#中的类
1 using LuaInterface; 2 using System; 3 4 namespace TestLua 5 { 6 class Program 7 { 8 static void Main(string[] args) 9 { 10 Lua lua = new Lua(); //创建一个lua解释器 11 lua.DoFile("test2.lua"); //Lua引用C#中的类 12 Console.ReadKey(); //等待输入 13 } 14 15 public int ChinarNum = 60; //整形变量 16 public string Name = "Chinar"; //字符串变量 17 18 ///19 /// 用来让Lua脚本测试的方法 20 /// 21 public void ChinarTestFun() 22 { 23 Console.WriteLine("你好,Chinar"); 24 } 25 26 /// 27 /// Ref方法,参数 28 /// 29 /// 30 /// 31 public void TestRef(string name, ref int count) 32 { 33 Console.WriteLine(name); 34 Console.WriteLine(count); 35 count = name.Length; 36 } 37 38 39 /// 40 /// Out方法,参数 41 /// 42 /// 43 /// 44 public void TestOut(string name, out int count) 45 { 46 Console.WriteLine(name); 47 count = name.Length; 48 } 49 } 50 }
test2.lua
1 -- 如果DeBug中有luanet.dll文件,则不需要再次引用 2 -- require "luanet" 3 -- 加载CLR类型("命名空间") 4 luanet.load_assembly("System") 5 -- 加载命名空间下的类 6 Int32 = luanet.import_type("System.Int32") 7 -- 输出 8 print(Int32) 9 print('- - - - - - - - - - - - - - - - - - - - - - - - - - ') 10 11 12 -- 加载CLR类型("命名空间"ChinarTest) 13 luanet.load_assembly("TestLua") 14 -- 加载命名空间下的类Program 15 Pro=luanet.import_type("TestLua.Program") 16 17 -- 实例化一个类对象 18 pro=Pro() 19 -- 输出 20 print(pro.ChinarNum) 21 22 -- 调用C#中的方法 23 pro:ChinarTestFun() 24 25 -- 调用Out方法,out参数不需要传入值,会直接返回类型为一个:表 26 -- 由于C#那边是一个空返回值的方法,所以第一个返回为空 27 -- 第二个返回 out参数 28 void,stringCount=pro:TestOut("chinar.fun") 29 print(void,stringCount) 30 31 -- Ref参数 32 void1,stringCount1=pro:TestRef("chinar.fun",8) 33 print(void1,stringCount1)
输出: