首页 > 代码库 > Lua与.net的CLR相互调用

Lua与.net的CLR相互调用

工程环境搭建:

  • 下载luainterface-1.5.3.zip文件,使用到的dll为Built目录下的LuaInterface.dll、lua51.dll、luanet.dll
  • LuaInterface.dll为C#的dll,需要引用到工程中
  • lua51.dll、luanet.dll为C++的dll,需要拷贝到工程的输出目录下(Debug)
  • C#调用Lua需要使用:LuaInterface.dll和lua51.dll
  • Lua调用C#的类需要使用:LuaInterface.dll和luanet.dll,luanet.dll拷贝到工程输出目录,lua脚本中就不需要使用package.cpath和require了

很多帖子并没有讲清楚导致报错:

“LuaInterface.LuaException”类型的未经处理的异常在 LuaInterface.dll 中发生
其他信息: error loading module luanet from file .\luanet.dll
也就是云哥我这么给力
 1 namespace TestLua
 2 {
 3     public class Program
 4     {
 5 
 6         public string name = "zhaozongyun";
 7         static void Main(string[] args)
 8         {
 9             //创建lua解释器(也叫Lua虚拟机)
10             Lua lua1 = new Lua();
11 
12             Console.WriteLine("--->> C#中执行Lua字符串");
13 
14             //C#中执行Lua字符串
15             lua1.DoString("num = 111");
16             lua1.DoString("str = ‘zhaozongyun‘");
17             Object[] values = lua1.DoString("return num, str");
18             foreach (Object obj in values)
19             {
20                 Console.WriteLine(obj);
21             }
22 
23             Console.WriteLine("--->> C#注册的普通方法到Lua中,并执行Lua字符串");
24 
25             //C#注册的普通方法到lua中,并执行Lua字符串
26             Program p = new Program();
27             Lua lua2 = new Lua();
28             lua2.RegisterFunction("LuaMethod1", p, p.GetType().GetMethod("CLRMethod"));
29             lua2.DoString("LuaMethod1()");
30 
31             Console.WriteLine("--->> C#注册静态方法到Lua中,并执行Lua字符串");
32 
33             //C#注册静态方法到Lua中,并执行Lua字符串
34             lua2.RegisterFunction("LuaMethod2", null, typeof(Program).GetMethod("StaticMethod"));
35             lua2.DoString("LuaMethod2()");
36 
37             Console.WriteLine("--->> C#中执行Lua脚本");
38 
39             //C#中执行lua脚本文件
40             Lua lua3 = new Lua();
41             lua3.DoFile("myLua1.lua");
42 
43             Console.WriteLine("--->>C#执行Lua脚本,Lua脚本中加载C#类,并访问C#");
44 
45             //C#执行Lua文件,Lua文件加载C#类,并调用C#
46             Lua lua4 = new Lua();
47             lua4.DoFile("myLua2.lua");
48             lua4.DoFile("myLua3.lua");
49 
50             Console.ReadKey();
51         }
52 
53         public void CLRMethod()
54         {
55             Console.WriteLine("CLRMethod");
56         }
57 
58         public static void StaticMethod()
59         {
60             Console.WriteLine("StaticMethod");
61         }
62     }
63 }

 

Lua1脚本

1 num = 222
2 string = "hello world"
3 print(string)

Lua2脚本

1 --加载CLR的类型、实例化CLR对象
2 luanet.load_assembly("System")
3 Int32 = luanet.import_type("System.Int32")
4 print(Int32)

Lua3脚本

1 --require "luanet"
2 --加载CLR的类型
3 luanet.load_assembly("TestLua")
4 Program = luanet.import_type("TestLua.Program")
5 --实例化CLR对象
6 program = Program()
7 print(program.name)
8 program:CLRMethod()

Lua与.net的CLR相互调用