zoukankan      html  css  js  c++  java
  • 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~

    如果你感兴趣,你可以把你妹妹介绍给我
  • 相关阅读:
    猫与路由器(还没看)
    ORA-12154: TNS: 无法解析指定的连接标识符(未解决)
    easy-batch demo
    mongodb 创建用户
    docker mongodb
    监听器,过滤器,拦截器
    mysql docker-compose启动异常:Database is uninitialized and password option is not specified
    设计模式-builder模式的价值
    【C++ Template | 04】折叠表达式
    【vim】vim插件教程
  • 原文地址:https://www.cnblogs.com/plateFace/p/4790279.html
Copyright © 2011-2022 走看看