Lua与.net的CLR相互调用

来源:互联网 发布:linux 驱动编写步骤 编辑:程序博客网 时间:2024/05/23 15:40

工程环境搭建:

  • 下载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 = 2222 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()
0 0
原创粉丝点击