本篇文章為大家展示了如何在C#項目中集成一個Lua腳本,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

這個dll是一個很輕量級的庫,100kb左右,引用這個庫可以通過Nuget包管理器來引用,當前引用的版本是1.5.7.0,我們看看引用之后的添加了哪些DLL。

這個里面lua54.dll有x86和x64兩個類型的版本,這個在使用的時候需要注意因為我們生成設置選擇的是Any CPU所以這里會有兩個版本的dll,這里使用的時候需要注意。
下面通過一個控制臺應用程序來看看這個腳本到底該怎么使用,這里包括直接創(chuàng)建表達式,注冊方法并使用lua調用C#函數(shù)以及直接導入C#的庫然后再調用里面內(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,就是直接調用DoString方法的時候返回的結果是一個object[]類型,所以這里需要取結果的時候要取用第一個

這里我們通過直接在DoString中定義好function,然后通過Call方法進行調用,我們再來看下面的示例及返回結果
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í)行的結果

下面的例子包含了幾種不同的參數(shù)類型及返回類型用來演示調用的完整過程。
using System;
using System.Linq;
using NLua;
namespace NLuaConsoleApp
{
class Program
{
static void Main(string[] args)
{
using (var state = new Lua())
{
////---------------------------------------------------lua調用c#函數(shù)
TestClass obj = new TestClass();
// 注冊CLR對象方法到Lua,供Lua調用 typeof(TestClass).GetMethod("TestPrint")
state.RegisterFunction("TestPrint", obj, obj.GetType().GetMethod("TestPrint"));
// 注冊CLR對象方法到Lua,供Lua調用 typeof(TestClass).GetMethod("AnotherFunc")
state.RegisterFunction("AnotherFunc", obj, obj.GetType().GetMethod("AnotherFunc"));
// 注冊CLR靜態(tài)方法到Lua,供Lua調用
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");
}
}
}
}同樣的我們來看整個測試的返回完整結果。

這個是按照官方的例子進行模擬的,但是在調用的時候總是報錯,現(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();
}
}
}這個就是說通過調用C#程序集并引入命名空間,然后調用其內(nèi)部的WebClient方法,這個在調試的時候一直都是報錯,這個暫時記錄供以后進行排查錯誤

上述內(nèi)容就是如何在C#項目中集成一個Lua腳本,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
分享名稱:如何在C#項目中集成一個Lua腳本-創(chuàng)新互聯(lián)
文章網(wǎng)址:http://www.chinadenli.net/article12/deeogc.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣、虛擬主機、網(wǎng)站制作、外貿(mào)網(wǎng)站建設、微信小程序、標簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容