lyh916

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

参考链接:

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         /// <summary>
27         /// 一个测试方法
28         /// </summary>
29         public void ChinarTest()
30         {
31             Console.WriteLine("这是一个空方法");
32         }
33 
34         /// <summary>
35         /// 一个静态测试方法
36         /// </summary>
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         /// <summary>
19         /// 用来让Lua脚本测试的方法
20         /// </summary>
21         public void ChinarTestFun()
22         {
23             Console.WriteLine("你好,Chinar");
24         }
25 
26         /// <summary>
27         /// Ref方法,参数
28         /// </summary>
29         /// <param name="name"></param>
30         /// <param name="count"></param>
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         /// <summary>
40         /// Out方法,参数
41         /// </summary>
42         /// <param name="name"></param>
43         /// <param name="count"></param>
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)

输出:

posted on 2020-01-26 13:55  艰苦奋斗中  阅读(1796)  评论(0编辑  收藏  举报