本篇文章為大家展示了如何在C#項目中集成一個Lua腳本,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
新邱網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)于2013年開始到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。這個dll是一個很輕量級的庫,100kb左右,引用這個庫可以通過Nuget包管理器來引用,當前引用的版本是1.5.7.0,我們看看引用之后的添加了哪些DLL。
這個里面lua54.dll有x86和x64兩個類型的版本,這個在使用的時候需要注意因為我們生成設(shè)置選擇的是Any CPU所以這里會有兩個版本的dll,這里使用的時候需要注意。
下面通過一個控制臺應(yīng)用程序來看看這個腳本到底該怎么使用,這里包括直接創(chuàng)建表達式,注冊方法并使用lua調(diào)用C#函數(shù)以及直接導(dǎo)入C#的庫然后再調(diào)用里面內(nèi)部的方法這三個方面進行描述。
我們來直接看控制臺程序中的代碼
class Program { static void Main(string[] args) { using (var state = new Lua()) { //Evaluating simple expressions: //Lua can return multiple values, for this reason DoString return a array of objects var res0 = state.DoString("return 10 + 3*(5 + 2)")[0]; Console.WriteLine($"Output result0:{res0}"); //Passing raw values to the state: double val = 12.0; state["x"] = val; // Create a global value 'x' var res1 = (double)state.DoString("return 10 + x*(5 + 2)")[0]; Console.WriteLine($"Output result1:{res1}"); //Retrieving global values: state.DoString("y = 10 + x*(5 + 2)"); double y = (double)state["y"]; // Retrieve the value of y Console.WriteLine($"Y result:{y}"); Console.ReadKey(); } }}
注意事項:
首先來看這個注釋:Lua can return multiple values, for this reason DoString return a array of objects,就是直接調(diào)用DoString方法的時候返回的結(jié)果是一個object[]類型,所以這里需要取結(jié)果的時候要取用第一個
這里我們通過直接在DoString中定義好function,然后通過Call方法進行調(diào)用,我們再來看下面的示例及返回結(jié)果
class Program { static void Main(string[] args) { using (var state = new Lua()) { //Retrieving Lua functions: state.DoString(@"function ScriptFunc (val1, val2) if val1 > val2 then return val1 + 1 else return val2 - 1 end end "); var scriptFunc = state["ScriptFunc"] as LuaFunction; var funcRes = scriptFunc.Call(3, 5).First(); Console.WriteLine($"Func result:{funcRes}"); Console.ReadKey(); } } }
同樣的我們也來看看最終執(zhí)行的結(jié)果
下面的例子包含了幾種不同的參數(shù)類型及返回類型用來演示調(diào)用的完整過程。
using System; using System.Linq; using NLua; namespace NLuaConsoleApp { class Program { static void Main(string[] args) { using (var state = new Lua()) { ////---------------------------------------------------lua調(diào)用c#函數(shù) TestClass obj = new TestClass(); // 注冊CLR對象方法到Lua,供Lua調(diào)用 typeof(TestClass).GetMethod("TestPrint") state.RegisterFunction("TestPrint", obj, obj.GetType().GetMethod("TestPrint")); // 注冊CLR對象方法到Lua,供Lua調(diào)用 typeof(TestClass).GetMethod("AnotherFunc") state.RegisterFunction("AnotherFunc", obj, obj.GetType().GetMethod("AnotherFunc")); // 注冊CLR靜態(tài)方法到Lua,供Lua調(diào)用 state.RegisterFunction("TestStaticPrint", null, typeof(TestClass).GetMethod("TestStaticPrint")); state.DoString("TestPrint(10,20)"); state.DoString("AnotherFunc('10','20')"); state.DoString("TestStaticPrint()"); Console.ReadKey(); } } class TestClass { public int TestPrint(int num,int num2) { var result = num + num2; Console.WriteLine("Print result:" + result); return result; } public void AnotherFunc(string val1, string val2) { Console.WriteLine($"MyTest,Param1:{val1},Param2:{val2}"); } public static void TestStaticPrint() { Console.WriteLine("TestStaticPrint"); } } } }
同樣的我們來看整個測試的返回完整結(jié)果。
這個是按照官方的例子進行模擬的,但是在調(diào)用的時候總是報錯,現(xiàn)貼出具體的示例供后面排查使用
class Program { static void Main(string[] args) { using (var state = new Lua()) { state.LoadCLRPackage(); state.DoString(@" import ('System.Web') "); state.DoString(@" client = WebClient() "); state.DoString(@"local res = client:DownloadString('http://nlua.org')"); Console.ReadKey(); } } }
這個就是說通過調(diào)用C#程序集并引入命名空間,然后調(diào)用其內(nèi)部的WebClient方法,這個在調(diào)試的時候一直都是報錯,這個暫時記錄供以后進行排查錯誤
上述內(nèi)容就是如何在C#項目中集成一個Lua腳本,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。