C#调用Lua

C#调用Lua

一、准备工作

1.lua官方接口 LuaInterface.dll、luanet.dll、lua51.dll。
链接:https://pan.baidu.com/s/1fhmje9LkLNJ8BSEGGLBsgQ
提取码:yxk1
复制这段内容后打开百度网盘手机App,操作更方便哦
2.打开VS创建一个控制台应用程序,将下载好的 LuaInterface.dll 文件拖到项目中,添加引用。
添加引用
3.找到项目中的目录,并将下载好的 lua51.dll 、 luanet.dll 两个文件,拷贝到
bin->DeBug文件目录中。

二、用C#在lua环境中编写lua

using System;
using LuaInterface; //引用命名空间
namespace ChinarTest
{
    class Program
    {
        static void Main(string[] args) 
        {
            Lua lua    = new Lua();        //创建一个lua解释器
            lua["num"] = 66;               //用C#脚本在lua环境中,创建一个变量
            lua["str"] = "chinar";         //用C#脚本在lua环境中,创建一个字符串变量
            Console.WriteLine(lua["num"]); //输出  66
            Console.WriteLine(lua["str"]); //输出 chinar
            Console.ReadKey();             //等待输入
        }
    }
}

三、在C#脚本中编写Lua脚本

using System;
using LuaInterface; //引用命名空间


namespace ChinarTest
{
    /// <summary>
    /// 测试类
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            Lua lua = new Lua();                              //创建一个lua解释器
            lua.DoString("num=666");                          //用C#脚本在lua环境中,创建一段lua脚本:num=666
            lua.DoString("str='chianr666'");                  //用C#脚本在lua环境中,创建一段lua脚本:str='chianr666'
            object[] values = lua.DoString("return num,str"); //用一个object数组 去接受返回值
            foreach (var value in values)                     //遍历 values 数组中的元素
            {
                Console.WriteLine(value); //输出   666 chianr666
            }

            Console.ReadKey(); //等待输入
        }
    }
}

四、用C#加载Lua脚本文件

将lua文件存放于bin->Debus目录下

using System;
using LuaInterface;
namespace ConsoleApp6
{
    class Program
    {
        static void Main(string[] args)
        {
            Lua mylua = new Lua();
            mylua.DoFile("lamlua.lua"); //存放在bin->Debus目录下
            Lua mylua1 = new Lua();
          }
 }

五、将C#中的函数/方法 写入到Lua脚本中

lua.RegisterFunction() 用于将C#中的函数/方法 写入到Lua脚本中

注册方法
lua.RegisterFunction (注册到Lua中以后方法的名称,程序对象,程序的类型program.GetType().(传入C#中的方法名:需要是公有方法))

注册静态方法
lua.RegisterFunction (注册到Lua中以后方法的名称,空,程序的类型 typeof(Program).(传入C#中的方法名:需要是公有方法))

注册的方法必须是 public ,否则会找不到

using System;
using LuaInterface; //引用命名空间
namespace ChinarTest
{
    /// <summary>
    /// 测试类
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            Lua     lua     = new Lua();     //创建一个lua解释器
            Program program = new Program(); //声明一个对象
            //lua.RegisterFunction 注册方法(注册到Lua中以后方法的名称,程序对象,程序的类型program.GetType().(传入C#中的方法名:需要是公有方法))
            lua.RegisterFunction("LuaChinarTest", program, program.GetType().GetMethod("ChinarTest"));
            //然后用lua.DoString(Lua中方法名())调用测试
            lua.DoString("LuaChinarTest()");
            //lua.RegisterFunction 注册静态方法(注册到Lua中以后方法的名称,空,程序的类型 typeof(Program).(传入C#中的方法名:需要是公有方法))
            lua.RegisterFunction("LuaChinarStaticTest", null, typeof(Program).GetMethod("ChinarStaticTest"));
            //然后用lua.DoString(Lua中静态方法名())调用测试
            lua.DoString("LuaChinarStaticTest()");
            Console.ReadKey(); //等待输入
        }
        /// <summary>
        /// 一个测试方法
        /// </summary>
        public void ChinarTest()
        {
            Console.WriteLine("这是一个空方法");
        }
        /// <summary>
        /// 一个静态测试方法
        /// </summary>
        public static void ChinarStaticTest()
        {
            Console.WriteLine("这个一个静态空方法");
        }
    }
}

六、 Lua中引用C#中的类

1.c#程序

using System;
using LuaInterface; //引用命名空间
namespace ChinarTest
{
    /// <summary>
    /// 测试类
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            Lua lua = new Lua();           //创建一个lua解释器
            lua.DoFile("ChinarClass.lua"); //Lua引用C#中的类
            Console.ReadKey();             //等待输入
        }
        public int    ChinarNum = 60;       //整形变量
        public string Name      = "Chinar"; //字符串变量
        /// <summary>
        /// 用来让Lua脚本测试的方法
        /// </summary>
        public void ChinarTestFun()
        {
            Console.WriteLine("你好,Chinar");
        }
        /// <summary>
        /// Ref方法,参数
        /// </summary>
        /// <param name="name"></param>
        /// <param name="count"></param>
        public void TestRef(string name, ref int count)
        {
            Console.WriteLine(name);
            Console.WriteLine(count);
            count = name.Length;
        }
        /// <summary>
        /// Out方法,参数
        /// </summary>
        /// <param name="name"></param>
        /// <param name="count"></param>
        public void TestOut(string name, out int count)
        {
            Console.WriteLine(name);
            count = name.Length;
        }
    }
}

2.ChinarClass.lua 文件

-- 如果DeBug中有luanet.dll文件,则不需要再次引用
-- require "luanet"
-- 加载CLR类型("命名空间")
luanet.load_assembly("System")
-- 加载命名空间下的类
Int32 = luanet.import_type("System.Int32")
-- 输出
print(Int32)
print('- - - - - - - - - - - - - - - - - - - - - - - - - - ')
-- 加载CLR类型("命名空间"ChinarTest)
luanet.load_assembly("ChinarTest")
-- 加载命名空间下的类Program
Pro=luanet.import_type("ChinarTest.Program")

-- 实例化一个类对象
pro=Pro()
-- 输出
print(pro.ChinarNum)

-- 调用C#中的方法
pro:ChinarTestFun()

-- 调用Out方法,out参数不需要传入值,会直接返回类型为一个:表
-- 由于C#那边是一个空返回值的方法,所以第一个返回为空
-- 第二个返回 out参数
void,stringCount=pro:TestOut("chinar.fun")
print(void,stringCount)

-- Ref参数
void1,stringCount1=pro:TestRef("chinar.fun",8)
print(void1,stringCount1)
  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值