欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

如何在C#項(xiàng)目中集成一個(gè)Lua腳本-創(chuàng)新互聯(lián)

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

新邱網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)于2013年開始到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。

步驟

1 引入NLua.dll

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

如何在C#項(xiàng)目中集成一個(gè)Lua腳本

這個(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#的庫然后再調(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();
   }
  }}

如何在C#項(xiàng)目中集成一個(gè)Lua腳本

注意事項(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è) 

如何在C#項(xiàng)目中集成一個(gè)Lua腳本

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é)果

如何在C#項(xiàng)目中集成一個(gè)Lua腳本

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è)測試的返回完整結(jié)果。

如何在C#項(xiàng)目中集成一個(gè)Lua腳本

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ò)誤

如何在C#項(xiàng)目中集成一個(gè)Lua腳本

上述內(nèi)容就是如何在C#項(xiàng)目中集成一個(gè)Lua腳本,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

分享名稱:如何在C#項(xiàng)目中集成一個(gè)Lua腳本-創(chuàng)新互聯(lián)
文章網(wǎng)址:http://chinadenli.net/article12/deeogc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣、虛擬主機(jī)、網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè)、微信小程序標(biāo)簽優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)