1、什么是LuaInterface?
LuaInterface包括两个核心库,一个是LuaInterface.dll,一个是Luanet.dll,我们可以通过LuaInterface来完成Lua和C#(CLR)之间的互相调用。
2、在CLR中执行Lua代码
创建一个C#工程,导入LuaInterface中的以下两个dll文件。
并添加到引用。
修改Program.cs代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LuaInterface;
namespace LuaInterface
{
class Program
{
static void Main(string[] args)
{
Lua lua = new Lua();//创建Lua解释器
lua["num"] = 34;
Console.WriteLine(lua["num"]);
Console.ReadKey();
}
}
}
此时运行项目,可能会出现以下错误。
我们继续修改App.config文件如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0" sku = ".NETFramework,Version=v4.0"/>
<supportedRuntime version="v2.0.50727"/>
</startup>
</configuration>
再次运行:
就看到我们想要看到的结果了。
这就是LuaInterface的一个简单示例。
接下来让我们继续。
3、在C#中执行Lua脚本文件,或者脚本字符串
①Dostring
在上面的工程中,修改Program.cs代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LuaInterface;
namespace LuaInterface
{
class Program
{
static void Main(string[] args)
{
Lua lua = new Lua(); //创建Lua解释器
lua.DoString("num=2");
lua.DoString("str='a string'");
object[] values = lua.DoString("return num,str");
foreach (object obj in values)
{
Console.WriteLine(obj);
}
Console.ReadKey();
}
}
}
执行结果:
②DoFile
在原工程目录下添加myLua.lua文件
修改myLua.lua文件如下:
num = 2
string = "hello world"
print(string)
修改Program.cs代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LuaInterface;
namespace LuaInterface
{
class Program
{
static void Main(string[] args)
{
Lua lua = new Lua(); //创建Lua解释器
lua.DoFile("myLua.lua");
Console.ReadKey();
}
}
}
记住先修改myLua.lua的属性:
否则可能会报出以下错误:
好了,让我们按F5看看输出结果。
结果如我们预期所料。
4、把一个C#方法注册进Lua的一个全局方法
①Lua和C#中类型的对应
②两个注册方法的使用
我们首先来看代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LuaInterface;
namespace LuaInterface
{
class Program
{
public void CLRMethod()
{
Console.WriteLine("----->CLRMethod");
}
public static void MystaticMethod()
{
Console.WriteLine("----->MystaticMethod");
}
static void Main(string[] args)
{
Program p = new Program();
Lua lua = new Lua(); //创建lua的解释器
//注册类的普通方法到Lua中
lua.RegisterFunction("LuaMethod1", p, p.GetType().GetMethod("CLRMethod"));
lua.DoString("LuaMethod1()");
//注册类的静态方法到Lua中
lua.RegisterFunction("LuaMethod2", null, typeof(Program).GetMethod("MystaticMethod"));
lua.DoString("LuaMethod2()");
Console.ReadKey();
}
}
}
运行结果如下:
让我们来分析一下这两个方法: