Lua是一种可爱的脚本语言,由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo所组成并于1993年开发。 其设计目的是为了嵌入应用程序中(多数指热更新),从而为应用程序提供灵活的扩展和定制功能.
LuaInterface Lua语言之间是一个库集成和微软。网络平台的公共语言运行时(CLR)。Lua脚本可以使用它来实例化CLR对象,访问属性、调用方法,甚至与Lua函数处理事件。(我们使用C#调用Lua, 当然你可以用C++)
你需要安装以下组件
LuaForWindows下载地址:http://luaforge.net/projects/luaforwindows/ 直接安装即可
LuaInterface下载地址:http://luaforge.net/projects/luainterface/ 下载之后把Lua51.dll, LuaInterface.dll 加入C#项目中
一、练习C#访问Lua定义变量
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using LuaInterface; namespace ConsoleApplication4 { class Program { static void Main(string[] args) { //Lua解释器,每一个解释器都是独立的 Lua lua = new Lua(); lua["num"] = 2; //创建数字变量 lua["name"] = "盘子脸"; //创建一个盘子脸名称 lua.NewTable("classList"); //创建一个班级列表 lua.DoString(@"print(‘hello Interface‘)"); //输出hello Interface lua.DoString(@"print(num)"); //输出2 lua.DoString(@"print(name)"); //输出盘子脸 lua.DoString(@"classList[1] = ‘123‘ print(classList[1])"); //输出123 //lua.DoFile(); 这个方法是执行一个Lua文件 //从Lua中获取定义的变量值 object[] values = lua.DoString("return num,name"); double num = (double)lua["num"]; string name = (string)lua["name"]; LuaTable table = (LuaTable)lua["classList"]; Console.WriteLine("num值: " + num); //输出 2 Console.WriteLine("name值: " + name); //输出 盘子脸 Console.WriteLine("table值: " + table[1]); //输出 123 Console.ReadLine(); } } }
如果你敲完代码发现程序无法运行,混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。解决方案:http://www.cnblogs.com/plateFace/p/4775257.html
二、方法注册到Lua,并使用Lua调用
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using LuaInterface; namespace ConsoleApplication4 { class Program { static void Main(string[] args) { Lua lua = new Lua(); Program obj = new Program(); //注册到Lua方法名可以不跟C#中的一样, 注册普通方法 lua.RegisterFunction("WriterMyName", obj, obj.GetType().GetMethod("NormalMethod")); lua.DoString("WriterMyName()"); //注册静态方法,obj的位置填写null, lua.RegisterFunction("StaticWriterMyName", null, typeof(Program).GetMethod("StaticMethod")); lua.DoString("StaticWriterMyName()"); Console.ReadLine(); } public void NormalMethod() { Console.WriteLine("我是盘子脸"); } public static void StaticMethod() { Console.WriteLine("我是静态的盘子脸"); } } }
三、Lua中使用C#的类和结构
下面在Lua代码中使用一下函数就可以实现Lua调用C#啦
- luanet.load_assembly函数:加载CLR程序集;
- luanet.import_type函数:加载程序集中的类型;
- luanet.get_constructor_bysig函数:显示获取某个特定的构造函数;
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using LuaInterface; namespace ConsoleApplication4 { class Program { static void Main(string[] args) { Lua lua = new Lua(); lua.DoFile("C:\\Lua\\MyLua.lua"); //调用Lua文件执行,Lua里面在调用C#的类和方法 Console.ReadLine(); } } //定义一个自己的的类 public class MyLife { public string myDog; public MyLife() { } public MyLife(string myDog) { this.myDog = myDog; } public void MyFace() { Console.WriteLine("my face is red"); } public void MyDogName() { Console.WriteLine("Dog name is " + myDog); } } }
Lua中的代码:
print("开始运行interface啦") luanet.load_assembly("System") --加载当前dll Int32 = luanet.import_type("System.Int32") --引入类型,准备使用C#的System.Int32类 num = Int32.Parse("123") --使用类型 print(Int32) --输出类型 print(num) --输出变量的值 luanet.load_assembly("ConsoleApplication4") MyLife = luanet.import_type("ConsoleApplication4.MyLife") life = MyLife() --创建类 life:MyFace() life2 = MyLife("哈皮狗") --使用有参构造创建类 life2:MyDogName()
//今天就先写到这里O(∩_∩)O~
时间: 2024-10-14 18:28:47