概述

  • LuaInterface是C#和Lua相连的桥梁
  • LuaInterface是一个开源的项目工程,内部有两个核心的dll文件
    • LuaInterface.dll 是C#代码中操作Lua代码需要依赖的文件
    • luanet.dll 是Lua代码中访问C#类库脚本需要依赖的文件

C#调用lua

//Program.cs
using System;
using LuaInterface;

namespace LuaWithCsharp01
{
    class Program
    {
        static void Main(string[] args)
        {
            //创建一个Lua解析对象
            Lua lua = new Lua();

            //变量声明与访问
            //方法1
            lua["name"] = "xiaoming";
            lua["age"] = 20;
            Console.WriteLine(lua["name"] + " " + lua["age"]);
            Console.WriteLine("-------------------------");
            //方法2
            lua.DoString("name = 'xiaoming' age = 20 address = 'china'");
            lua.DoString("print(name,age,address)");
            Console.WriteLine("-------------------------");

            //for循环语句
            lua.DoString(@"
                        for i = 0, 10, 1 do 
                            print(i) 
                        end");
            Console.WriteLine("-------------------------");

            //函数的定义与调用

            lua.DoString(@"
                        function Show(name,age,gender)
                            print(name,age,gender)
                        end
                        Show('xiaoming',20,'男')
                        ");
            Console.WriteLine("-------------------------");

            //table数组的声明和访问
            lua.DoString("myArray = {'aaa','bbb','ccc','ddd'}");
            lua.DoString(@"
                        for i = 1,table.getn(myArray),1 do
                            print(myArray[i])
                        end");
            Console.WriteLine("-------------------------");

            //通过DoFile文件访问外部lua程序
            lua.DoFile("test.lua");

            //获取外部文件的变量和函数
            string name = lua.GetString("name");
            double age = lua.GetNumber("age");
            Console.WriteLine(name + " " + age);

            LuaFunction Show = lua.GetFunction("Show");
            Show.Call("小张", 30, "男");

            LuaFunction Add = lua.GetFunction("Add");
            Object[] obj = Add.Call(1, 2);
            Console.WriteLine(obj[0]);

            Console.ReadKey();
        }
    }
}
/*
输出
xiaoming 20
-------------------------
xiaoming        20      china
-------------------------
0
1
2
3
4
5
6
7
8
9
10
-------------------------
xiaoming        20      男
-------------------------
aaa
bbb
ccc
ddd
-------------------------
monster1        100
TakeDamage
monster1        90
-------------------------
xiaohong        10      女
xiaoming 20
小张    30      男
3
*/
--test.lua:
local monster1 = {
    name = "monster1",
    hp = 100
}
function monster1:Show()
    print(self.name,self.hp)
end


function monster1:TakeDamage(damage)
    print("TakeDamage")
    self.hp = self.hp - damage
end

monster1:Show()
monster1:TakeDamage(10)
monster1:Show()

function Add(a,b)
    return a+b
end

print("-------------------------")

-- Lua脚本可以访问到DoString函数添加到代码空间的代码
Show("xiaohong",10,"女")
  • 需要引入LuaInterface这个命名空间
  • DoString主要用于执行一些较短的Lua代码片段,较长的代码读取外部的lua文件
  • DoString执行过的代码都会增加到Lua代码空间,在Lua代码文件中,是直接可以访问到这些代码的

lua调用C#

--test.lua
--导入luanet.dll
require "luanet"
--获取程序集
luanet.load_assembly("LuaWithCsharp02")
luanet.load_assembly("System")
--获取类型
Calc = luanet.import_type("LuaWithCsharp02.Calc")
Console = luanet.import_type("System.Console")

--调用C#工程中的函数
print(Calc.name)
print(Calc.Jia(1,2))
print(Calc.Jian(1,2))
print(Calc.Cheng(3,2))
print(Calc.Chu(4,2))
Console.WriteLine("ABCDEFG")
str = Console.ReadLine()
Console.WriteLine("您输入的是" .. str)
using System;
namespace LuaWithCsharp02
{
    class Calc
    {
        public static string name = "计算器类"; 
        public static int Jia(int a, int b)
        {
            return a + b;
        }
        public static int Jian(int a, int b)
        {
            return a - b;
        }
        public static int Cheng(int a, int b)
        {
            return a * b;
        }
        public static int Chu(int a, int b)
        {
            return a / b;
        }
        public static void Show()
        {
            Console.WriteLine("Calc类内的方法");
        }
    }
}
using System;
using LuaInterface;
namespace LuaWithCsharp02
{
    class Program
    {
        static void Main(string[] args)
        {
            Lua lua = new Lua();
            lua.DoFile("test.lua");
            Console.ReadKey();
        }
    }
}
/*输出
计算器类
3
-1
6
2
ABCDEFG
ceshi
您输入的是ceshi
*/
  • 由于lua是解释型语言,修改项目的lua代码,就可以直接改变打包后程序的逻辑关系,这就是热更新的原理