ulua
- 2021 年 2 月 13 日
- 筆記
一.C#調用lua
LuaInterface包含LuaInterface.dll和Luanet.dll兩個核心類庫,可以完成lua和c#(CLR)之間的相互調用。注意版本問題,我使用的時候一直報錯找不到dll,下載使用了新版的luaInterface後解決。
使用LuaInterface完成c#對lua的調用,使用luanet完成lua對c#的調用。2.0.3版本的LuaInterface中並沒有luanet,所以需要下載其他版本的luanet。
1.簡單使用
在VS中新建一個C#控制台程式,引入LuaInterface和lua51兩個類庫。我使用的是2.0.3版本,下載地址://files.luaforge.net/releases/luainterface/luainterface
using LuaInterface; using System; namespace Programs { class Program { static void Main(string[] args) { Lua lua = new Lua(); lua["num"] = 34; Console.WriteLine(lua["num"]); } } }
在這段程式中,使用類似於數組的方式為變數賦值。
2.DoString方法(執行一句lua語句)
using LuaInterface; using System; namespace Programs { class Program { static void Main(string[] args) { Lua lua = new Lua(); lua.DoString("num=2"); lua.DoString("str='a string'"); object[] values = lua.DoString("return num,str"); foreach(object o in values) { Console.WriteLine(o); } Console.ReadKey(); } } }
3.DoFile方法(讀取並執行一個lua文件中的lua程式碼)
lua文件名稱MyLua.lua
num = 2 str = 'movin' print(num,str)
using LuaInterface; using System; namespace Programs { class Program { static void Main(string[] args) { Lua lua = new Lua(); lua.DoFile("MyLua.lua"); Console.ReadKey(); } } }
4.使用類似數組的方式取得lua中的變數
using LuaInterface; using System; namespace Programs { class Program { static void Main(string[] args) { Lua lua = new Lua(); lua.DoFile("MyLua.lua"); double num = (double)lua["num"]; Console.WriteLine(num); Console.ReadKey(); } } }
5.把C#的方法註冊為lua的全局方法
using LuaInterface; using System; namespace Programs { class Program { static void Main(string[] args) { Lua lua = new Lua(); Program p = new Program(); //註冊一個方法,首先需要new一個對象,然後通過反射獲得對象中的方法並註冊 //這一句程式碼將CLRMethod這個方法註冊到lua中並保存為名稱是LuaMethod的方法 lua.RegisterFunction("LuaMethod", p, p.GetType().GetMethod("CLRMethod")); //通過DoString方法調用方法 lua.DoString("LuaMethod()"); Console.ReadKey(); } public void CLRMethod() { Console.WriteLine("movin 最帥"); } } }
6.將C#的靜態方法註冊進lua
using LuaInterface; using System; namespace Programs { class Program { static void Main(string[] args) { Lua lua = new Lua(); lua.RegisterFunction("LuaCLRMethod", null, typeof(Program).GetMethod("CLRMethod")); lua.DoString("LuaCLRMethod()"); Console.ReadKey(); } public static void CLRMethod() { Console.WriteLine("movin 最帥"); } } }
二.lua調用c#
將luanet.dll拷貝到項目的輸出目錄bin/debug下,注意拷貝後就不要再在lua文件中使用require引入luanet了,這樣反而會出錯。
1.簡單使用
using LuaInterface; using System; namespace Programs { class Program { static void Main(string[] args) { Lua lua = new Lua(); lua.DoFile("MyLua.lua"); Console.ReadKey(); } public static void CLRMethod() { Console.WriteLine("movin 最帥"); } } }
--載入System這個dll luanet.load_assembly("System") Int32 = luanet.import_type("System.Int32") print(Int32)
2.lua獲取c#變數
--載入System這個dll luanet.load_assembly("System") --導入類 I32 = luanet.import_type("System.Int32") --創建對象 num = I32.Parse("23") print(num)
3.lua訪問c#屬性和方法
訪問c#屬性和方法時,將這些屬性方法當作table的鍵值進行訪問。使用luanet.load_assembly載入命名空間,使用luanet.import_type方法訪問類。