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()