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

C#和lua相互調(diào)用的方法教程

 更新時(shí)間:2017年11月04日 09:24:29   作者:Mr.小Y  
lua是一種腳本語(yǔ)言,可以方便的移植到各種宿主語(yǔ)言中,并且可以支持熱更新,在游戲開(kāi)發(fā)中也能當(dāng)做主要的語(yǔ)言來(lái)編寫(xiě)游戲的邏輯,所以這篇文章主要給大家介紹了關(guān)于C#和lua相互調(diào)用的方法教程,需要的朋友可以參考下。

前言

自從ulua在官網(wǎng)上出來(lái)后,lua 就被u3d開(kāi)發(fā)人員喜愛(ài)。國(guó)內(nèi)有幾個(gè)高手把lua拿過(guò)來(lái) 接著進(jìn)行了封裝。很多都是新手轉(zhuǎn)過(guò)來(lái)。lua語(yǔ)法一看遍知,但是大多數(shù)人還是不明白兩個(gè)語(yǔ)言之間的互相調(diào)用是怎么一回事,這也是難點(diǎn)和重點(diǎn)。所以今天想跟大家分享一下這方面的知識(shí),讓大家少走彎路吧。

Lua是一種很好的擴(kuò)展性語(yǔ)言,Lua解釋器被設(shè)計(jì)成一個(gè)很容易嵌入到宿主程序的庫(kù)。LuaInterface則用于實(shí)現(xiàn)Lua和CLR的混合編程。

C與lua交互面臨以下幾個(gè)問(wèn)題:

1、由于lua里面的數(shù)據(jù)都是動(dòng)態(tài)加載的所以內(nèi)存也是動(dòng)態(tài)分配的,也沒(méi)有static 這樣的修飾,而C里面有 static const 這樣的靜態(tài)類(lèi)型數(shù)據(jù)

2、c里面是手動(dòng)管理內(nèi)存lua 里面是自動(dòng)管理內(nèi)存

所以為了解決這些問(wèn)題就采用了一個(gè)抽象棧來(lái)讓lua與c交換值,好比c里面的 void*  可以指向任何地址而不用管存儲(chǔ)類(lèi)型。這樣兩邊都不管你傳的何種類(lèi)型的參數(shù),只用知道它是一個(gè)地址指針。兩邊用的時(shí)候再?gòu)?qiáng)制轉(zhuǎn)換成對(duì)應(yīng)的類(lèi)型。

下面開(kāi)始本文的正文吧。

(一)C#調(diào)用Lua

測(cè)試環(huán)境:在VS2015中建一個(gè)C#控制臺(tái)應(yīng)用程序,并添加LuaInterface.dll的引用

LuaInterface下載地址:http://luaforge.net/projects/luainterface/(下載luainterface-1.5.3,這里面的資源比較多)

LuaInterface.Lua類(lèi)是CLR訪問(wèn)Lua解釋器的主要接口,一個(gè)LuaInterface.Lua類(lèi)對(duì)象就代表了一個(gè)Lua解釋器(或Lua執(zhí)行環(huán)境),Lua解釋器可以同時(shí)存在多個(gè),并且它們之間是完全相互獨(dú)立的。

簡(jiǎn)單說(shuō)明下步驟:

在根目錄處添加LuaInterface.dll的引用:

  

  

不啰嗦、直接上代碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LuaInterface;

namespace CSharpToLua
{
  class Program
  {
    static void Main(string[] args)
    {
      // 新建一個(gè)Lua解釋器,每一個(gè)Lua實(shí)例都相互獨(dú)立, 一個(gè)global全局域
      Lua lua = new Lua();

      //---------------------------------------------------
      // Lua的索引操作[]可以創(chuàng)建、訪問(wèn)、修改global域
      lua["age"] = 20;
      lua["name"] = "Mr.huang";

      string luaCode = "print(\"This is Lua code\")";
      lua.DoString(luaCode);//執(zhí)行l(wèi)ua腳本代碼
        lua.DoFile("F:\\CSharpToLua\\CSharpToLua\\ScriptsFromFile.lua");//執(zhí)行l(wèi)ua腳本文件,這里我直接用了絕對(duì)定位

      double age = (double)lua["age"];

      Console.WriteLine("age = {0}", age);
      Console.WriteLine("width = {0}", lua["width"]);
      Console.ReadKey();
    }
  }

}

可以跟著敲一遍,提高與代碼的親密度 ~.~ And then 點(diǎn)擊啟動(dòng)

咦、這時(shí)會(huì)出現(xiàn)一個(gè)報(bào)錯(cuò)、但是不要緊、

解決方案:

  

再次運(yùn)行、就可以看到結(jié)果啦、驚不驚喜、意不意外

簡(jiǎn)單的介紹C#如何調(diào)用Lua代碼、當(dāng)然、還有很多豐富的API小伙伴們可以自行查閱喲。

(二)Lua調(diào)用C#

直接上代碼 ~.~

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LuaInterface;

namespace CSharpToLua
{
  class Program
  {
    static void Main(string[] args)
    {
      // 新建一個(gè)Lua解釋器,每一個(gè)Lua實(shí)例都相互獨(dú)立, 一個(gè)global全局域
      Lua lua = new Lua();


      //---------------------------------------------------lua調(diào)用c#函數(shù)
      TestClass obj = new TestClass();

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

      // 注冊(cè)CLR靜態(tài)方法到Lua,供Lua調(diào)用
      lua.RegisterFunction("TestStaticPrint", null, typeof(TestClass).GetMethod("TestStaticPrint"));

      lua.DoString("TestPrint(10)");
      lua.DoString("TestStaticPrint()");

      Console.ReadKey();
    }
  }

  class TestClass
  {
    private int value = 0;

    public void TestPrint(int num)
    {
      value = num;
      Console.WriteLine("CSharp"+value);
    }

    public static void TestStaticPrint()
    {
      Console.WriteLine("TestStaticPrint");
    }
  }
}

點(diǎn)擊運(yùn)行.................

  

perfect~.~ 當(dāng)然、這里只是簡(jiǎn)單的介紹C#與Lua是如何相互調(diào)用的、小伙伴可自行Google大量豐富的API方便開(kāi)發(fā)喲

重要的事要說(shuō)三遍:LuaInterface是主要接口、LuaInterface是主要接口、LuaInterface是主要接口

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

最新評(píng)論

海淀区| 沽源县| 山丹县| 临猗县| 桂平市| 凤翔县| 吕梁市| 安乡县| 潞西市| 十堰市| 扎兰屯市| 皋兰县| 南汇区| 龙里县| 兖州市| 浪卡子县| 荥经县| 称多县| 诸城市| 闵行区| 徐汇区| 黎城县| 临漳县| 尼勒克县| 新安县| 丹江口市| 呼玛县| 新源县| 天气| 巧家县| 大余县| 商南县| 莱西市| 秀山| 龙南县| 连云港市| 独山县| 博野县| 南昌市| 称多县| 冀州市|