• LuaInterface和Luanet学习笔记


    一.C#调用lua

    LuaInterface包含LuaInterface.dll和Luanet.dll两个核心类库,可以完成lua和c#(CLR)之间的相互调用。注意版本问题,我使用的时候一直报错找不到dll,下载使用了新版的luaInterface后解决。

    使用LuaInterface完成c#对lua的调用,使用luanet完成lua对c#的调用。2.0.3版本的LuaInterface中并没有luanet,所以需要下载其他版本的luanet。

    1.简单使用

    在VS中新建一个C#控制台程序,引入LuaInterface和lua51两个类库。我使用的是2.0.3版本,下载地址:http://files.luaforge.net/releases/luainterface/luainterface

    using LuaInterface;
    using System;
    
    namespace Programs
    {
        class Program
        {
            static void Main(string[] args)
            {
                Lua lua = new Lua();
                lua["num"] = 34;
                Console.WriteLine(lua["num"]);
            }
        }
    }

     在这段程序中,使用类似于数组的方式为变量赋值。

    2.DoString方法(执行一句lua语句)

    using LuaInterface;
    using System;
    
    namespace Programs
    {
        class Program
        {
            static void Main(string[] args)
            {
                Lua lua = new Lua();
                lua.DoString("num=2");
                lua.DoString("str='a string'");
                object[] values = lua.DoString("return num,str");
                
                foreach(object o in values)
                {
                    Console.WriteLine(o);
                }
    
                Console.ReadKey();
            }
        }
    }

     3.DoFile方法(读取并执行一个lua文件中的lua代码)

    lua文件名称MyLua.lua

    num = 2
    str = 'movin'
    print(num,str)
    using LuaInterface;
    using System;
    
    namespace Programs
    {
        class Program
        {
            static void Main(string[] args)
            {
                Lua lua = new Lua();
                lua.DoFile("MyLua.lua");
                Console.ReadKey();
            }
        }
    }

     4.使用类似数组的方式取得lua中的变量

    using LuaInterface;
    using System;
    
    namespace Programs
    {
        class Program
        {
            static void Main(string[] args)
            {
                Lua lua = new Lua();
                lua.DoFile("MyLua.lua");
                double num = (double)lua["num"];
                Console.WriteLine(num);
                Console.ReadKey();
            }
        }
    }

     5.把C#的方法注册为lua的全局方法

    using LuaInterface;
    using System;
    
    namespace Programs
    {
        class Program
        {
            static void Main(string[] args)
            {
                Lua lua = new Lua();
                Program p = new Program();
                //注册一个方法,首先需要new一个对象,然后通过反射获得对象中的方法并注册
                //这一句代码将CLRMethod这个方法注册到lua中并保存为名称是LuaMethod的方法
                lua.RegisterFunction("LuaMethod", p, p.GetType().GetMethod("CLRMethod"));
                //通过DoString方法调用方法
                lua.DoString("LuaMethod()");
                Console.ReadKey();
            }
    
            public void CLRMethod()
            {
                Console.WriteLine("movin 最帅");
            }
        }
    }

     6.将C#的静态方法注册进lua

    using LuaInterface;
    using System;
    
    namespace Programs
    {
        class Program
        {
            static void Main(string[] args)
            {
                Lua lua = new Lua();
                lua.RegisterFunction("LuaCLRMethod", null, typeof(Program).GetMethod("CLRMethod"));
                lua.DoString("LuaCLRMethod()");
                Console.ReadKey();
            }
    
            public static void CLRMethod()
            {
                Console.WriteLine("movin 最帅");
            }
        }
    }

     二.lua调用c#

    将luanet.dll拷贝到项目的输出目录bin/debug下,注意拷贝后就不要再在lua文件中使用require引入luanet了,这样反而会出错。

    1.简单使用

    using LuaInterface;
    using System;
    
    namespace Programs
    {
        class Program
        {
            static void Main(string[] args)
            {
                Lua lua = new Lua();
                lua.DoFile("MyLua.lua");
                Console.ReadKey();
            }
    
            public static void CLRMethod()
            {
                Console.WriteLine("movin 最帅");
            }
        }
    }
    --加载System这个dll
    luanet.load_assembly("System")
    
    Int32 = luanet.import_type("System.Int32")
    
    print(Int32)

     2.lua获取c#变量

    --加载System这个dll
    luanet.load_assembly("System")
    --导入类
    I32 = luanet.import_type("System.Int32")
    --创建对象
    num = I32.Parse("23")
    
    print(num)

     3.lua访问c#属性和方法

    访问c#属性和方法时,将这些属性方法当作table的键值进行访问。使用luanet.load_assembly加载命名空间,使用luanet.import_type方法访问类。

  • 相关阅读:
    Java 强、弱、软、虚,你属于哪一种?
    为啥阿里巴巴规定要在 @Transactional 指定 rollbackFor?
    DataGrip 上手体验,真香!
    日志框架选型,Logback 还是 Log4j2?
    基于OpenLayers和ArcGIS Server REST的要素信息保存功能
    基于Openlayers和Arcgis Server REST实现地图(要素)点击查询功能
    使用OpenLayers加载ArcGIS Server矢量图层
    ArcGIS Server在线编辑功能
    使用OpenLayers显示百度地图
    如何分析SAP ABAP的SYSTEM_NO_ROLL运行时错误
  • 原文地址:https://www.cnblogs.com/movin2333/p/14400803.html
Copyright © 2020-2023  润新知