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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM