1. 程式人生 > >1、在C#與Lua相互呼叫

1、在C#與Lua相互呼叫

一、利用LuaInterface呼叫lua程式碼

1、下載luainterface,這裡用的luainterface-1.5.3版本。

2、新增 LuaInterface.dll的引用。

3、利用直譯器進行呼叫

  1. using System;  
  2. using LuaInterface;  
  3. class Program  
  4. {  
  5.     staticvoid Main(string[] args)  
  6.     {  
  7.         Lua lua = new Lua();//建立LUA直譯器
  8.         lua["num"] = 34;  
  9.         Console.WriteLine(lua["num"
    ]);  
  10.         Console.ReadLine();  
  11.     }  
  12. }  

二、lua.Dostring執行

  1. using System;  
  2. using LuaInterface;  
  3. class Program  
  4. {  
  5.     staticvoid Main(string[] args)  
  6.     {  
  7.         Lua lua = new Lua();//建立LUA直譯器
  8.         lua.DoString("str = 'a lua string'");  
  9.         lua.DoString("num = 2");  
  10.         object
    [] values = lua.DoString("return num,str");  
  11.         foreach(object obj in values)  
  12.             Console.WriteLine(obj);  
  13.         Console.ReadLine();  
  14.     }  
  15. }  

三、lua.DoFile執行

c#程式碼

  1. using System;  
  2. using LuaInterface;  
  3. class Program  
  4. {  
  5.     staticvoid Main(string[] args)  
  6.     {  
  7.         Lua lua = new
     Lua();//建立LUA直譯器
  8.         lua.DoFile("mylua.lua");  
  9.         Console.ReadLine();  
  10.     }  
  11. }  
lua程式碼,PS:要使用ANSI編碼儲存
  1. num = 2;  
  2. str = "lua string"  
  3. print(num,str)  

四、將C#普通方法註冊到Lua

  1. using System;  
  2. using LuaInterface;  
  3. class Program  
  4. {  
  5.     staticvoid Main(string[] args)  
  6.     {  
  7.         Lua lua = new Lua();//建立LUA直譯器
  8.         Program p = new Program();  
  9.         lua.RegisterFunction("CLRMethod", p, p.GetType().GetMethod("CLRMethod"));  
  10.         lua.DoString("CLRMethod()");  
  11.         Console.ReadLine();  
  12.     }  
  13.     publicvoid CLRMethod()  
  14.     {  
  15.         Console.WriteLine("CLRMethod is Run");  
  16.     }  
  17. }  

五、將C#靜態方法註冊到Lua
  1. using System;  
  2. using LuaInterface;  
  3. class Program  
  4. {  
  5.     staticvoid Main(string[] args)  
  6.     {  
  7.         Lua lua = new Lua();//建立LUA直譯器
  8.         lua.RegisterFunction("CLRMethod"nulltypeof(Program).GetMethod("CLRMethod"));  
  9.         lua.DoString("CLRMethod()");  
  10.         Console.ReadLine();  
  11.     }  
  12.     publicstaticvoid CLRMethod()  
  13.     {  
  14.         Console.WriteLine("Static CLRMethod is Run");  
  15.     }  
  16. }  

六、Lua呼叫C#方法

1、將luanet.dll 放入Debug目錄下

  1. require "luanet"  
  2. luanet.load_assembly("System");  
  3. Int32 = luanet.import_type("System.Int32");  
  4. num = Int32.Parse("3425")  
  5. print(num)   
  6. print(Int32)   

2、例項II,將程式集名稱與名稱空間改成testluainterface

  1. using LuaInterface;  
  2. namespace testluainterface  
  3. {  
  4.     class Program  
  5.     {  
  6.         staticvoid Main(string[] args)  
  7.         {  
  8.             Lua lua = new Lua();//建立LUA直譯器
  9.             lua.DoFile("mylua.lua");  
  10.             Console.ReadLine();  
  11.         }  
  12.         publicstring name = "name of program";  
  13.         publicvoid TestMethod()  
  14.         {  
  15.             Console.WriteLine("TestMethod is Run");  
  16.         }  
  17.     }  
  18. }  
  1. require "luanet"  
  2. luanet.load_assembly("testluainterface")  
  3. Program = luanet.import_type("testluainterface.Program")  
  4. program1 = Program()  
  5. print(program1.name)  
  6. program1:TestMethod()  


七、Lua呼叫C#特殊方法(out ref)

1、當函式中有out或ref引數時,out引數和ref引數和函式的返回值一起返回,並且呼叫的時候,out引數不需要傳入

out和ref會作為返回值和c#方法組成一個table一起返回,先返回方法返回值,再返回out或ref

  1. using System;  
  2. using LuaInterface;  
  3. namespace testluainterface  
  4. {  
  5.     class Program  
  6.     {  
  7.         staticvoid Main(string[] args)  
  8.         {  
  9.             Lua lua = new Lua();//建立LUA直譯器
  10.             lua.DoFile("mylua.lua");  
  11.             Console.ReadLine();  
  12.         }  
  13.         publicvoid TestOut(string text, outstring msg)  
  14.         {  
  15.             Console.WriteLine(text);  
  16.             msg = "out";  
  17.         }  
  18.         publicvoid TestRef(string text, refstring msg)  
  19.         {  
  20.             Console.WriteLine(text);  
  21.             msg = "ref";  
  22.         }  
  23.     }  
  24. }  
  1. require "luanet"  
  2. luanet.load_assembly("testluainterface")  
  3. Program = luanet.import_type("testluainterface.Program")  
  4. program1 = Program()  
  5. print(program1:TestOut("Lua out"))  
  6. print(program1:TestRef("Lua ref","C# ref"))