最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何在C#中集成Lua腳本

 更新時(shí)間:2021年02月27日 11:52:48   作者:Hello——尋夢(mèng)者!  
這篇文章主要介紹了如何在C#中集成Lua腳本,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下

背景

  在很多時(shí)候我們代碼中的一些邏輯操作并不能夠硬編碼到代碼中,我們可能希望通過配置來完成這個(gè)操作,所以這個(gè)時(shí)候我們就需要有一些腳本語(yǔ)言能夠處理這些操作,在C#語(yǔ)言中比較常見的就是通過引入NLua這個(gè)動(dòng)態(tài)庫(kù)來引入lua腳本語(yǔ)言從而達(dá)到靈活配置的目的,這篇文章主要是通過具體的實(shí)例來說明在C#中如何通過引入NLua并調(diào)用配置的腳本。

步驟

1 引入NLua.dll

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

這個(gè)里面lua54.dll有x86和x64兩個(gè)類型的版本,這個(gè)在使用的時(shí)候需要注意因?yàn)槲覀兩稍O(shè)置選擇的是Any CPU所以這里會(huì)有兩個(gè)版本的dll,這里使用的時(shí)候需要注意。

2 具體用法

  下面通過一個(gè)控制臺(tái)應(yīng)用程序來看看這個(gè)腳本到底該怎么使用,這里包括直接創(chuàng)建表達(dá)式,注冊(cè)方法并使用lua調(diào)用C#函數(shù)以及直接導(dǎo)入C#的庫(kù)然后再調(diào)用里面內(nèi)部的方法這三個(gè)方面進(jìn)行描述。

  2.1 直接創(chuàng)建表達(dá)式

       我們來直接看控制臺(tá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();
   }
  }}

注意事項(xiàng):

  首先來看這個(gè)注釋:Lua can return multiple values, for this reason DoString return a array of objects,就是直接調(diào)用DoString方法的時(shí)候返回的結(jié)果是一個(gè)object[]類型,所以這里需要取結(jié)果的時(shí)候要取用第一個(gè) 

  2.2 注冊(cè)Lua Function

  這里我們通過直接在DoString中定義好function,然后通過Call方法進(jìn)行調(diào)用,我們?cè)賮砜聪旅娴氖纠胺祷亟Y(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é)果

  2.3 Lua調(diào)用C#函數(shù)

  下面的例子包含了幾種不同的參數(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();

    // 注冊(cè)CLR對(duì)象方法到Lua,供Lua調(diào)用 typeof(TestClass).GetMethod("TestPrint")
    state.RegisterFunction("TestPrint", obj, obj.GetType().GetMethod("TestPrint"));

    // 注冊(cè)CLR對(duì)象方法到Lua,供Lua調(diào)用 typeof(TestClass).GetMethod("AnotherFunc")
    state.RegisterFunction("AnotherFunc", obj, obj.GetType().GetMethod("AnotherFunc"));

    // 注冊(cè)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");
   }
  }

 }
}

  同樣的我們來看整個(gè)測(cè)試的返回完整結(jié)果。

  2.4 通過Import導(dǎo)入命名空間引用C#函數(shù)

  這個(gè)是按照官方的例子進(jìn)行模擬的,但是在調(diào)用的時(shí)候總是報(bào)錯(cuò),現(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();
   }
  }
 }

  這個(gè)就是說通過調(diào)用C#程序集并引入命名空間,然后調(diào)用其內(nèi)部的WebClient方法,這個(gè)在調(diào)試的時(shí)候一直都是報(bào)錯(cuò),這個(gè)暫時(shí)記錄供以后進(jìn)行排查錯(cuò)誤

3 總結(jié)

  這里有一些地方需要注意Lua對(duì)象是實(shí)現(xiàn)了IDispose接口的,所以我們?cè)谑褂玫臅r(shí)候需要注意使用using方式或者是使用后調(diào)用Dispose方法來對(duì)資源進(jìn)行釋放。另外C#中引入Lua腳本的常見主要是適用于部分調(diào)用過程不適合硬編碼在代碼里而適合放在配置中,通過配置不同的Lua腳本從而對(duì)程序進(jìn)行定制化操作,是對(duì)現(xiàn)有代碼一個(gè)很好的補(bǔ)充,另外對(duì)于調(diào)用C#中dll的方法出現(xiàn)的問題還在研究中,后面發(fā)現(xiàn)了再更新此過程。

以上就是如何在C#中集成Lua腳本的詳細(xì)內(nèi)容,更多關(guān)于C#中集成Lua腳本的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 基于WebRequest.RegisterPrefix的使用詳解

    基于WebRequest.RegisterPrefix的使用詳解

    本篇文章對(duì)WebRequest.RegisterPrefix的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C#中的異常處理問題try catch finally

    C#中的異常處理問題try catch finally

    這篇文章主要介紹了C#中的異常處理問題try catch finally,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 淺談C#中ListView類的用法

    淺談C#中ListView類的用法

    這篇文章主要介紹了淺談C#中ListView的用法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • C#語(yǔ)言async?await工作原理示例解析

    C#語(yǔ)言async?await工作原理示例解析

    這篇文章主要為大家介紹了C#語(yǔ)言async?await工作原理示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • WPF實(shí)現(xiàn)類似ChatGPT逐字打印效果的示例代碼

    WPF實(shí)現(xiàn)類似ChatGPT逐字打印效果的示例代碼

    前一段時(shí)間ChatGPT類的應(yīng)用十分火爆,這類應(yīng)用在回答用戶的問題時(shí)逐字打印輸出,像極了真人打字回復(fù)消息,本文就來利用WPF模擬一下這種逐字打印的效果吧
    2023-08-08
  • C#計(jì)算代碼執(zhí)行時(shí)間的方法

    C#計(jì)算代碼執(zhí)行時(shí)間的方法

    在一些測(cè)試工作時(shí)我們需要獲得高精度的代碼執(zhí)行時(shí)間以比較其效率。
    2013-03-03
  • C#導(dǎo)出文本內(nèi)容到word文檔的方法

    C#導(dǎo)出文本內(nèi)容到word文檔的方法

    這篇文章主要介紹了C#導(dǎo)出文本內(nèi)容到word文檔的方法,涉及C#操作word文檔的相關(guān)技巧,需要的朋友可以參考下
    2015-04-04
  • C#遞歸讀取XML菜單數(shù)據(jù)的方法

    C#遞歸讀取XML菜單數(shù)據(jù)的方法

    這篇文章主要介紹了C#遞歸讀取XML菜單數(shù)據(jù)的方法,涉及遞歸的操作技巧與C#窗體的用法,對(duì)于進(jìn)行C#項(xiàng)目開發(fā)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2014-12-12
  • C#中Stopwatch的使用及說明

    C#中Stopwatch的使用及說明

    這篇文章主要介紹了C#中Stopwatch的使用及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • VS2022+unity3D開發(fā)環(huán)境搭建的實(shí)現(xiàn)步驟

    VS2022+unity3D開發(fā)環(huán)境搭建的實(shí)現(xiàn)步驟

    本文主要介紹了VS2022+unity3D開發(fā)環(huán)境搭建的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05

最新評(píng)論

汽车| 台中市| 南宁市| 宁国市| 沾益县| 岚皋县| 突泉县| 锡林郭勒盟| 黑龙江省| 遂川县| 维西| 汕尾市| 库伦旗| 阳新县| 福泉市| 文山县| 家居| 虹口区| 南丰县| 镇康县| 思南县| 曲周县| 蕲春县| 永州市| 云浮市| 沙洋县| 揭东县| 遂溪县| 孝昌县| 沙河市| 阳江市| 衢州市| 天祝| 湖北省| 蕉岭县| 安吉县| 崇礼县| 山东省| 绥宁县| 伊宁县| 绥滨县|