欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

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

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

C與lua交互面臨以下幾個問題:

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

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

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

下面開始本文的正文吧。

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

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

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

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

簡單說明下步驟:

在根目錄處添加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)
    {
      // 新建一個Lua解釋器,每一個Lua實例都相互獨立, 一個global全局域
      Lua lua = new Lua();

      //---------------------------------------------------
      // Lua的索引操作[]可以創(chuàng)建、訪問、修改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腳本文件,這里我直接用了絕對定位

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

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

}

可以跟著敲一遍,提高與代碼的親密度 ~.~ And then 點擊啟動

咦、這時會出現(xiàn)一個報錯、但是不要緊、

解決方案:

  

再次運行、就可以看到結果啦、驚不驚喜、意不意外

簡單的介紹C#如何調(diào)用Lua代碼、當然、還有很多豐富的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)
    {
      // 新建一個Lua解釋器,每一個Lua實例都相互獨立, 一個global全局域
      Lua lua = new Lua();


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

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

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

點擊運行.................

  

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

重要的事要說三遍:LuaInterface是主要接口、LuaInterface是主要接口、LuaInterface是主要接口

總結

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

相關文章

  • C#清理非托管對象實例分析

    C#清理非托管對象實例分析

    這篇文章主要介紹了C#清理非托管對象的方法,結合實例形式詳細分析了C#清理非托管對象釋放資源的相關原理與實現(xiàn)技巧,需要的朋友可以參考下
    2016-02-02
  • C#算法設計之關于1000瓶水的問題

    C#算法設計之關于1000瓶水的問題

    這篇文章主要介紹了C#算法設計之關于1000瓶水的問題,是一個比較經(jīng)典的算法問題,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-01-01
  • 基于C#實現(xiàn)文檔打印功能

    基于C#實現(xiàn)文檔打印功能

    在軟件開發(fā)過程中,文檔打印是一個常見的功能需求,本文將詳細介紹如何在C#中實現(xiàn)文檔打印,并通過代碼示例介紹的非常詳細,對大家的學習或工作有一定幫助,需要的朋友可以參考下
    2024-10-10
  • C#實現(xiàn)Zip壓縮目錄中所有文件的方法

    C#實現(xiàn)Zip壓縮目錄中所有文件的方法

    這篇文章主要介紹了C#實現(xiàn)Zip壓縮目錄中所有文件的方法,涉及C#針對文件的讀寫與zip壓縮相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • C#實現(xiàn)線段樹的示例代碼

    C#實現(xiàn)線段樹的示例代碼

    線段樹是一種常用來維護區(qū)間信息的數(shù)據(jù)結構,本文主要介紹了C#實現(xiàn)線段樹的示例代碼,具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • C#實現(xiàn)工廠方法模式

    C#實現(xiàn)工廠方法模式

    這篇文章介紹了C#實現(xiàn)工廠模式的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • .NET的深復制方法(以C#語言為例)

    .NET的深復制方法(以C#語言為例)

    深復制需要將對象實例中字段引用的對象也進行復制,在平時的編程工作中經(jīng)常要用到這種復制方式,下面以c#為例來演示一下方法。
    2016-10-10
  • WPF下如何自定義MessageBox消息提示

    WPF下如何自定義MessageBox消息提示

    這篇文章主要介紹了WPF下如何自定義MessageBox消息提示問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • C#接口(Interface)用法分析

    C#接口(Interface)用法分析

    這篇文章主要介紹了C#接口(Interface)用法,較為詳細的分析了C#中接口的功能、實現(xiàn)及使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • 詳解C#如何判斷字符串的顯示寬度

    詳解C#如何判斷字符串的顯示寬度

    這篇文章主要為大家詳細介紹了C#判斷字符串的顯示寬度的相關知識,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴可以了解一下
    2023-11-11

最新評論