您的位置:首页 > 编程语言 > Lua

Lua与.net的CLR相互调用

2017-02-28 12:03 337 查看

工程环境搭建:

下载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()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: