Lua Interface基础使用

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#项目中

image

 

一、练习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~

posted @ 2015-09-07 23:24  盘子脸  阅读(3592)  评论(0编辑  收藏  举报