引言: 勇哥想研究一下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"))

