C#和lua相互調(diào)用的方法教程
前言
自從ulua在官網(wǎng)上出來后,lua 就被u3d開發(fā)人員喜愛。國內(nèi)有幾個(gè)高手把lua拿過來 接著進(jìn)行了封裝。很多都是新手轉(zhuǎn)過來。lua語法一看遍知,但是大多數(shù)人還是不明白兩個(gè)語言之間的互相調(diào)用是怎么一回事,這也是難點(diǎn)和重點(diǎn)。所以今天想跟大家分享一下這方面的知識,讓大家少走彎路吧。
Lua是一種很好的擴(kuò)展性語言,Lua解釋器被設(shè)計(jì)成一個(gè)很容易嵌入到宿主程序的庫。LuaInterface則用于實(shí)現(xiàn)Lua和CLR的混合編程。
C與lua交互面臨以下幾個(gè)問題:
1、由于lua里面的數(shù)據(jù)都是動(dòng)態(tài)加載的所以內(nèi)存也是動(dòng)態(tài)分配的,也沒有static 這樣的修飾,而C里面有 static const 這樣的靜態(tài)類型數(shù)據(jù)
2、c里面是手動(dòng)管理內(nèi)存lua 里面是自動(dòng)管理內(nèi)存
所以為了解決這些問題就采用了一個(gè)抽象棧來讓lua與c交換值,好比c里面的 void* 可以指向任何地址而不用管存儲類型。這樣兩邊都不管你傳的何種類型的參數(shù),只用知道它是一個(gè)地址指針。兩邊用的時(shí)候再強(qiáng)制轉(zhuǎn)換成對應(yīng)的類型。
下面開始本文的正文吧。
(一)C#調(diào)用Lua
測試環(huán)境:在VS2015中建一個(gè)C#控制臺應(yīng)用程序,并添加LuaInterface.dll的引用
LuaInterface下載地址:http://luaforge.net/projects/luainterface/(下載luainterface-1.5.3,這里面的資源比較多)
LuaInterface.Lua類是CLR訪問Lua解釋器的主要接口,一個(gè)LuaInterface.Lua類對象就代表了一個(gè)Lua解釋器(或Lua執(zhí)行環(huán)境),Lua解釋器可以同時(shí)存在多個(gè),并且它們之間是完全相互獨(dú)立的。
簡單說明下步驟:

在根目錄處添加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)建、訪問、修改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 點(diǎn)擊啟動(dòng)
咦、這時(shí)會出現(xiàn)一個(gè)報(bào)錯(cuò)、但是不要緊、

解決方案:

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

簡單的介紹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();
// 注冊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");
}
}
}
點(diǎn)擊運(yùn)行.................

perfect~.~ 當(dāng)然、這里只是簡單的介紹C#與Lua是如何相互調(diào)用的、小伙伴可自行Google大量豐富的API方便開發(fā)喲
重要的事要說三遍:LuaInterface是主要接口、LuaInterface是主要接口、LuaInterface是主要接口
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
C#算法設(shè)計(jì)之關(guān)于1000瓶水的問題
這篇文章主要介紹了C#算法設(shè)計(jì)之關(guān)于1000瓶水的問題,是一個(gè)比較經(jīng)典的算法問題,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01
C#實(shí)現(xiàn)Zip壓縮目錄中所有文件的方法
這篇文章主要介紹了C#實(shí)現(xiàn)Zip壓縮目錄中所有文件的方法,涉及C#針對文件的讀寫與zip壓縮相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07

