Lua Interface基礎使用


Lua是一種可愛的腳本語言,由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo所組成並於1993年開發。 其設計目的是為了嵌入應用程序中(多數指熱更新),從而為應用程序提供靈活的擴展和定制功能.

LuaInterface Lua語言之間是一個庫集成和微軟。網絡平台的公共語言運行時(CLR)。Lua腳本可以使用它來實例化CLR對象,訪問屬性、調用方法,甚至與Lua函數處理事件。(我們使用C#調用Lua, 當然你可以用C++)

你需要安裝以下組件

LuaForWindows下載地址:http://luaforge.net/projects/luaforwindows/   直接安裝即可

LuaInterface下載地址:http://luaforge.net/projects/luainterface/    下載之后把Lua51.dll, LuaInterface.dll 加入C#項目中

image

 

一、練習C#訪問Lua定義變量

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

namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            //Lua解釋器,每一個解釋器都是獨立的
            Lua lua = new Lua();

           lua["num"] = 2;             //創建數字變量
             lua["name"] = "盤子臉";     //創建一個盤子臉名稱
             lua.NewTable("classList");  //創建一個班級列表

              lua.DoString(@"print('hello Interface')");                         //輸出hello Interface
            lua.DoString(@"print(num)");                                       //輸出2
            lua.DoString(@"print(name)");                                       //輸出盤子臉
              lua.DoString(@"classList[1] = '123' print(classList[1])");        //輸出123

            //lua.DoFile();         這個方法是執行一個Lua文件

              //從Lua中獲取定義的變量值
              object[] values = lua.DoString("return num,name");
            double num = (double)lua["num"];
            string name = (string)lua["name"];
            LuaTable table = (LuaTable)lua["classList"];


            Console.WriteLine("num值: " + num);          //輸出 2
            Console.WriteLine("name值: " + name);        //輸出 盤子臉
              Console.WriteLine("table值: " + table[1]);   //輸出 123



            Console.ReadLine();
        }
    }
}

如果你敲完代碼發現程序無法運行,混合模式程序集是針對“v2.0.50727”版的運行時生成的,在沒有配置其他信息的情況下,無法在 4.0 運行時中加載該程序集。解決方案:http://www.cnblogs.com/plateFace/p/4775257.html

 

二、方法注冊到Lua,並使用Lua調用

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

namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            Lua lua = new Lua();
            Program obj = new Program();

            //注冊到Lua方法名可以不跟C#中的一樣, 注冊普通方法
              lua.RegisterFunction("WriterMyName", obj, obj.GetType().GetMethod("NormalMethod"));
            lua.DoString("WriterMyName()");

            //注冊靜態方法,obj的位置填寫null,
            lua.RegisterFunction("StaticWriterMyName", null, typeof(Program).GetMethod("StaticMethod"));
            lua.DoString("StaticWriterMyName()");

            Console.ReadLine();
        }

        public void NormalMethod() 
        {
            Console.WriteLine("我是盤子臉");
        }

        public static void StaticMethod()
        {
            Console.WriteLine("我是靜態的盤子臉");
        }

    }
}

 

三、Lua中使用C#的類和結構

下面在Lua代碼中使用一下函數就可以實現Lua調用C#啦

  • luanet.load_assembly函數:加載CLR程序集;
  • luanet.import_type函數:加載程序集中的類型;
  • luanet.get_constructor_bysig函數:顯示獲取某個特定的構造函數;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LuaInterface;

namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            Lua lua = new Lua();
            lua.DoFile("C:\\Lua\\MyLua.lua");   //調用Lua文件執行,Lua里面在調用C#的類和方法

            Console.ReadLine();
        }
    }

    //定義一個自己的的類
    public class MyLife
    {
        public string myDog;
        public MyLife() { }
        public MyLife(string myDog)
        {
            this.myDog = myDog;
        }
        public void MyFace()
        {
            Console.WriteLine("my face is red");
        }
        public void MyDogName()
        {
            Console.WriteLine("Dog name is " + myDog);
        }
    }
}

Lua中的代碼:

print("開始運行interface啦")
luanet.load_assembly("System")                --加載當前dll
Int32 = luanet.import_type("System.Int32")     --引入類型,准備使用C#的System.Int32類
num = Int32.Parse("123")                    --使用類型
print(Int32)                                --輸出類型
print(num)                                    --輸出變量的值

luanet.load_assembly("ConsoleApplication4")
MyLife = luanet.import_type("ConsoleApplication4.MyLife")
life = MyLife()            --創建類
life:MyFace()

life2 = MyLife("哈皮狗")            --使用有參構造創建類
life2:MyDogName()

 

 

//今天就先寫到這里O(∩_∩)O~


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com