引言: 勇哥想研究一下C#内嵌脚本的知识。 主要想把运动控制、视觉的一些功能封装成指令,用脚本语言进行调用。 就像机器人的vb语言,它就是把一些功能封装成指令进行调用。

例如lua可以扩展nginx的功能,直接访问MySql数据库,达到1000k的访问量级别。

另外,Lua也是可以扩展游戏的功能,即做游戏外挂。
一、利用LuaInterface调用lua代码
1、下载luainterface,这里用的luainterface-1.5.3版本。
2、添加 LuaInterface.dll的引用。
3、利用解释器进行调用
using LuaInterface;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Lua lua = new Lua();//创建LUA解释器
lua["num"] = 34;
Console.WriteLine(lua["num"]);
Console.ReadLine();
}
}
}运行结果是控制台输出34

注意bin目录下必须有lua的三个dll

二、lua.Dostring执行
//lua.Dostring执行
static void Main(string[] args)
{
Lua lua = new Lua();//创建LUA解释器
lua.DoString("str = 'a lua string'");
lua.DoString("num = 2");
object[] values = lua.DoString("return num,str");
foreach (object obj in values)
Console.WriteLine(obj);
Console.ReadLine();
}结果:

三、lua.DoFile执行
c#代码
static void Main(string[] args)
{
Lua lua = new Lua();//创建LUA解释器
lua.DoFile("luaCode.lua");
Console.ReadLine();
}执行结果:

lua代码,PS:要使用ANSI编码保存

num = 2; str = "lua string" print(num,str)
四、将C#普通方法注册到Lua
//将C#普通方法注册到Lua
static void Main(string[] args)
{
Lua lua = new Lua();//创建LUA解释器
Program p = new Program();
lua.RegisterFunction("CLRMethod", p, p.GetType().GetMethod("CLRMethod"));
lua.DoString("CLRMethod()");
Console.ReadLine();
}
public void CLRMethod()
{
Console.WriteLine("CLRMethod is Run");
}结果:

五、将C#静态方法注册到Lua
//将C#静态方法注册到Lua
static void Main(string[] args)
{
Lua lua = new Lua();//创建LUA解释器
lua.RegisterFunction("CLRMethod", null, typeof(Program).GetMethod("CLRMethod"));
lua.DoString("CLRMethod()");
Console.ReadLine();
}
public static void CLRMethod()
{
Console.WriteLine("Static CLRMethod is Run");
}结果:

六、Lua调用C#方法
1、将luanet.dll 放入Debug目录下
[plain] view plain copy
require "luanet"
luanet.load_assembly("System");
Int32 = luanet.import_type("System.Int32");
num = Int32.Parse("3425")
print(num)
print(Int32)
2、实例II,将程序集名称与命名空间改成testluainterface
[csharp] view plain copy
using LuaInterface;
namespace testluainterface
{
class Program
{
static void Main(string[] args)
{
Lua lua = new Lua();//创建LUA解释器
lua.DoFile("mylua.lua");
Console.ReadLine();
}
public string name = "name of program";
public void TestMethod()
{
Console.WriteLine("TestMethod is Run");
}
}
}
[plain] view plain copy
require "luanet"
luanet.load_assembly("testluainterface")
Program = luanet.import_type("testluainterface.Program")
program1 = Program()
print(program1.name)
program1:TestMethod()
七、Lua调用C#特殊方法(out ref)
1、当函数中有out或ref参数时,out参数和ref参数和函数的返回值一起返回,并且调用的时候,out参数不需要传入
out和ref会作为返回值和c#方法组成一个table一起返回,先返回方法返回值,再返回out或ref
[csharp] view plain copy
using System;
using LuaInterface;
namespace testluainterface
{
class Program
{
static void Main(string[] args)
{
Lua lua = new Lua();//创建LUA解释器
lua.DoFile("mylua.lua");
Console.ReadLine();
}
public void TestOut(string text, out string msg)
{
Console.WriteLine(text);
msg = "out";
}
public void TestRef(string text, ref string msg)
{
Console.WriteLine(text);
msg = "ref";
}
}
}
[plain] view plain copy
require "luanet"
luanet.load_assembly("testluainterface")
Program = luanet.import_type("testluainterface.Program")
program1 = Program()
print(program1:TestOut("Lua out"))
print(program1:TestRef("Lua ref","C# ref"))