概述
- 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代码,就可以直接改变打包后程序的逻辑关系,这就是热更新的原理