LuaInterface

movin2333發表於2021-02-13

一.C#呼叫lua

LuaInterface包含LuaInterface.dll和Luanet.dll兩個核心類庫,可以完成lua和c#(CLR)之間的相互呼叫。注意版本問題,我使用的時候一直報錯找不到dll,下載使用了新版的luaInterface後解決。

使用LuaInterface完成c#對lua的呼叫,使用luanet完成lua對c#的呼叫。2.0.3版本的LuaInterface中並沒有luanet,所以需要下載其他版本的luanet。

1.簡單使用

在VS中新建一個C#控制檯程式,引入LuaInterface和lua51兩個類庫。我使用的是2.0.3版本,下載地址:http://files.luaforge.net/releases/luainterface/luainterface

using LuaInterface;
using System;

namespace Programs
{
    class Program
    {
        static void Main(string[] args)
        {
            Lua lua = new Lua();
            lua["num"] = 34;
            Console.WriteLine(lua["num"]);
        }
    }
}

 

 

 在這段程式中,使用類似於陣列的方式為變數賦值。

2.DoString方法(執行一句lua語句)

using LuaInterface;
using System;

namespace Programs
{
    class Program
    {
        static void Main(string[] args)
        {
            Lua lua = new Lua();
            lua.DoString("num=2");
            lua.DoString("str='a string'");
            object[] values = lua.DoString("return num,str");
            
            foreach(object o in values)
            {
                Console.WriteLine(o);
            }

            Console.ReadKey();
        }
    }
}

 

 

 3.DoFile方法(讀取並執行一個lua檔案中的lua程式碼)

lua檔名稱MyLua.lua

num = 2
str = 'movin'
print(num,str)
using LuaInterface;
using System;

namespace Programs
{
    class Program
    {
        static void Main(string[] args)
        {
            Lua lua = new Lua();
            lua.DoFile("MyLua.lua");
            Console.ReadKey();
        }
    }
}

 

 

 4.使用類似陣列的方式取得lua中的變數

using LuaInterface;
using System;

namespace Programs
{
    class Program
    {
        static void Main(string[] args)
        {
            Lua lua = new Lua();
            lua.DoFile("MyLua.lua");
            double num = (double)lua["num"];
            Console.WriteLine(num);
            Console.ReadKey();
        }
    }
}

 

 5.把C#的方法註冊為lua的全域性方法

using LuaInterface;
using System;

namespace Programs
{
    class Program
    {
        static void Main(string[] args)
        {
            Lua lua = new Lua();
            Program p = new Program();
            //註冊一個方法,首先需要new一個物件,然後通過反射獲得物件中的方法並註冊
            //這一句程式碼將CLRMethod這個方法註冊到lua中並儲存為名稱是LuaMethod的方法
            lua.RegisterFunction("LuaMethod", p, p.GetType().GetMethod("CLRMethod"));
            //通過DoString方法呼叫方法
            lua.DoString("LuaMethod()");
            Console.ReadKey();
        }

        public void CLRMethod()
        {
            Console.WriteLine("movin 最帥");
        }
    }
}

 

 6.將C#的靜態方法註冊進lua

using LuaInterface;
using System;

namespace Programs
{
    class Program
    {
        static void Main(string[] args)
        {
            Lua lua = new Lua();
            lua.RegisterFunction("LuaCLRMethod", null, typeof(Program).GetMethod("CLRMethod"));
            lua.DoString("LuaCLRMethod()");
            Console.ReadKey();
        }

        public static void CLRMethod()
        {
            Console.WriteLine("movin 最帥");
        }
    }
}

 

 二.lua呼叫c#

將luanet.dll拷貝到專案的輸出目錄bin/debug下,注意拷貝後就不要再在lua檔案中使用require引入luanet了,這樣反而會出錯。

1.簡單使用

using LuaInterface;
using System;

namespace Programs
{
    class Program
    {
        static void Main(string[] args)
        {
            Lua lua = new Lua();
            lua.DoFile("MyLua.lua");
            Console.ReadKey();
        }

        public static void CLRMethod()
        {
            Console.WriteLine("movin 最帥");
        }
    }
}
--載入System這個dll
luanet.load_assembly("System")

Int32 = luanet.import_type("System.Int32")

print(Int32)

 

 2.lua獲取c#變數

--載入System這個dll
luanet.load_assembly("System")
--匯入類
I32 = luanet.import_type("System.Int32")
--建立物件
num = I32.Parse("23")

print(num)

 

 3.lua訪問c#屬性和方法

訪問c#屬性和方法時,將這些屬性方法當作table的鍵值進行訪問。使用luanet.load_assembly載入名稱空間,使用luanet.import_type方法訪問類。