C#调用Lua
2019-07-02 16:51
316 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_41096537/article/details/94439438
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('- - - - - - - - - - - - - - - - - - - - - - - - - - ') -- 3ff7 加载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)
相关文章推荐
- Redis进阶实践之八Lua的Cjson在Linux下安装、使用和用C#调用Lua脚本
- Unity3D 预备知识:C#与Lua相互调用
- Lua的系统学习(杂)_通过Lua调用C#方法(热更新最直观的原理理解)_简单的随机数实现
- ulua在C#中调用lua并传递参数
- Unity SLua 如何调用Unity中C#方法
- unity 热更新:C#与Lua相互调用(转载)
- Redis进阶实践之八Lua的Cjson在Linux下安装、使用和用C#调用Lua脚本
- xlua入门(3)c#调用Lua脚本
- Unity中使用 slua --- 调用c#方法
- Unity3D开发小贴士(五)Lua调用C#
- C#调用脚本语言(三)-- IronJS 与 IronLua 简单方法性能比较
- 通过LuaInterface完成Lua和C#之间的互相调用
- C#和lua相互调用的方法教程
- 1、在C#与Lua相互调用
- 1、在C#与Lua相互调用
- 实现Lua脚本调用C#脚本 LuaFramework(五)
- Unity SLua 如何调用Unity中C#方法
- 在C#中通过lua调用C#中的类方法
- Unity3D开发小贴士(六)Lua里调用C#扩展
- unity ulua之lua调用c#