前言
自從ulua在官網上出來后,lua 就被u3d開發人員喜愛。國內有幾個高手把lua拿過來 接著進行了封裝。很多都是新手轉過來。lua語法一看遍知,但是大多數人還是不明白兩個語言之間的互相調用是怎么一回事,這也是難點和重點。所以今天想跟大家分享一下這方面的知識,讓大家少走彎路吧。
lua是一種很好的擴展性語言,lua解釋器被設計成一個很容易嵌入到宿主程序的庫。luainterface則用于實現lua和clr的混合編程。
c與lua交互面臨以下幾個問題:
1、由于lua里面的數據都是動態加載的所以內存也是動態分配的,也沒有static 這樣的修飾,而c里面有 static const 這樣的靜態類型數據
2、c里面是手動管理內存lua 里面是自動管理內存
所以為了解決這些問題就采用了一個抽象棧來讓lua與c交換值,好比c里面的 void* 可以指向任何地址而不用管存儲類型。這樣兩邊都不管你傳的何種類型的參數,只用知道它是一個地址指針。兩邊用的時候再強制轉換成對應的類型。
下面開始本文的正文吧。
(一)c#調用lua
測試環境:在vs2015中建一個c#控制臺應用程序,并添加luainterface.dll的引用
luainterface下載地址:http://luaforge.net/projects/luainterface/(下載luainterface-1.5.3,這里面的資源比較多)
luainterface.lua類是clr訪問lua解釋器的主要接口,一個luainterface.lua類對象就代表了一個lua解釋器(或lua執行環境),lua解釋器可以同時存在多個,并且它們之間是完全相互獨立的。
簡單說明下步驟:
在根目錄處添加luainterface.dll的引用:
不啰嗦、直接上代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
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的索引操作[]可以創建、訪問、修改global域 lua[ "age" ] = 20; lua[ "name" ] = "mr.huang" ; string luacode = "print(\"this is lua code\")" ; lua.dostring(luacode); //執行lua腳本代碼 lua.dofile( "f:\\csharptolua\\csharptolua\\scriptsfromfile.lua" ); //執行lua腳本文件,這里我直接用了絕對定位 double age = ( double )lua[ "age" ]; console.writeline( "age = {0}" , age); console.writeline( "width = {0}" , lua[ "width" ]); console.readkey(); } } } |
可以跟著敲一遍,提高與代碼的親密度 ~.~ and then 點擊啟動
咦、這時會出現一個報錯、但是不要緊、
解決方案:
再次運行、就可以看到結果啦、驚不驚喜、意不意外
簡單的介紹c#如何調用lua代碼、當然、還有很多豐富的api小伙伴們可以自行查閱喲。
(二)lua調用c#
直接上代碼 ~.~
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
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調用c#函數 testclass obj = new testclass(); // 注冊clr對象方法到lua,供lua調用 typeof(testclass).getmethod("testprint") lua.registerfunction( "testprint" , obj, obj.gettype().getmethod( "testprint" )); // 注冊clr靜態方法到lua,供lua調用 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是如何相互調用的、小伙伴可自行google大量豐富的api方便開發喲
重要的事要說三遍:luainterface是主要接口、luainterface是主要接口、luainterface是主要接口
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。
原文鏈接:http://www.cnblogs.com/huangzongyi/p/7777635.html