zoukankan      html  css  js  c++  java
  • [Lua]与c#的交互(一)

    参考链接:

    https://www.cnblogs.com/chinarbolg/p/9601452.html

    luainterface下载(推荐用1.5.3):

    http://files.luaforge.net/releases/luainterface/luainterface

    0.准备

    下载好luainterface后解压,打开Built文件夹,里面的3个dll后面会用到

    创建一个c#控制台项目,添加引用,选择上面的LuaInterface.dll。然后将上面的lua51.dll和luanet.dll复制到项目中的binDebug目录下

    1.创建lua解释器

     1 using LuaInterface;
     2 using System;
     3 
     4 namespace TestLua
     5 {
     6     class Program
     7     {
     8         static void Main(string[] args)
     9         {
    10             Lua lua = new Lua();        //创建一个lua解释器
    11             lua["num"] = 66;               //用C#脚本在lua环境中,创建一个变量
    12             lua["str"] = "chinar";         //用C#脚本在lua环境中,创建一个字符串变量
    13             Console.WriteLine(lua["num"]); //输出
    14             Console.WriteLine(lua["str"]); //输出
    15             Console.ReadKey();             //等待输入
    16         }
    17     }
    18 }

    输出:

    2.执行lua代码段(lua.DoString)

     1 using LuaInterface;
     2 using System;
     3 
     4 namespace TestLua
     5 {
     6     class Program
     7     {
     8         static void Main(string[] args)
     9         {
    10             Lua lua = new Lua();                              //创建一个lua解释器
    11             lua.DoString("num=666");                          //用C#脚本在lua环境中,创建一段lua脚本:num=666
    12             lua.DoString("str='chianr666'");                  //用C#脚本在lua环境中,创建一段lua脚本:str='chianr666'
    13             object[] values = lua.DoString("return num,str"); //用一个object数组 去接受返回值
    14             foreach (var value in values)                     //遍历 values 数组中的元素
    15             {
    16                 Console.WriteLine(value); //输出
    17             }
    18             Console.ReadKey(); //等待输入
    19         }
    20     }
    21 }

    输出:

    3.执行lua代码文件(lua.DoFile)

     1 using LuaInterface;
     2 using System;
     3 
     4 namespace TestLua
     5 {
     6     class Program
     7     {
     8         static void Main(string[] args)
     9         {
    10             Lua lua = new Lua();      //创建一个lua解释器
    11             lua.DoFile("test.lua");    //加载lua文件 —— lua.DoFile(文件名)
    12             Console.ReadKey();        //等待输入
    13         }
    14     }
    15 }

    test.lua

    1 print('I am Chianr')
    2 MyTable={1,22,333,4444,55555,666666}
    3 print(table.concat(MyTable)..'I am Chianr')

    注意要将上面的lua文件拖到项目根目录中,并且修改属性如下,这样lua文件才能被识别到

    输出:

    4.将c#的方法注册到lua中,供lua调用(lua.RegisterFunction)

     1 using LuaInterface;
     2 using System;
     3 
     4 namespace TestLua
     5 {
     6     class Program
     7     {
     8         static void Main(string[] args)
     9         {
    10             Lua lua = new Lua();     //创建一个lua解释器
    11             Program program = new Program(); //声明一个对象
    12 
    13             //lua.RegisterFunction 注册方法(注册到Lua中以后方法的名称,程序对象,程序的类型program.GetType().(传入C#中的方法名:需要是公有方法))
    14             lua.RegisterFunction("LuaChinarTest", program, program.GetType().GetMethod("ChinarTest"));
    15             //然后用lua.DoString(Lua中方法名())调用测试
    16             lua.DoString("LuaChinarTest()");
    17 
    18             //lua.RegisterFunction 注册静态方法(注册到Lua中以后方法的名称,空,程序的类型 typeof(Program).(传入C#中的方法名:需要是公有方法))
    19             lua.RegisterFunction("LuaChinarStaticTest", null, typeof(Program).GetMethod("ChinarStaticTest"));
    20             //然后用lua.DoString(Lua中静态方法名())调用测试
    21             lua.DoString("LuaChinarStaticTest()");
    22 
    23             Console.ReadKey(); //等待输入
    24         }
    25 
    26         /// <summary>
    27         /// 一个测试方法
    28         /// </summary>
    29         public void ChinarTest()
    30         {
    31             Console.WriteLine("这是一个空方法");
    32         }
    33 
    34         /// <summary>
    35         /// 一个静态测试方法
    36         /// </summary>
    37         public static void ChinarStaticTest()
    38         {
    39             Console.WriteLine("这个一个静态空方法");
    40         }
    41     }
    42 }

    输出:

    5.lua调用c#中的类

     1 using LuaInterface;
     2 using System;
     3 
     4 namespace TestLua
     5 {
     6     class Program
     7     {
     8         static void Main(string[] args)
     9         {
    10             Lua lua = new Lua();           //创建一个lua解释器
    11             lua.DoFile("test2.lua"); //Lua引用C#中的类
    12             Console.ReadKey();             //等待输入
    13         }
    14 
    15         public int ChinarNum = 60;       //整形变量
    16         public string Name = "Chinar"; //字符串变量
    17 
    18         /// <summary>
    19         /// 用来让Lua脚本测试的方法
    20         /// </summary>
    21         public void ChinarTestFun()
    22         {
    23             Console.WriteLine("你好,Chinar");
    24         }
    25 
    26         /// <summary>
    27         /// Ref方法,参数
    28         /// </summary>
    29         /// <param name="name"></param>
    30         /// <param name="count"></param>
    31         public void TestRef(string name, ref int count)
    32         {
    33             Console.WriteLine(name);
    34             Console.WriteLine(count);
    35             count = name.Length;
    36         }
    37 
    38 
    39         /// <summary>
    40         /// Out方法,参数
    41         /// </summary>
    42         /// <param name="name"></param>
    43         /// <param name="count"></param>
    44         public void TestOut(string name, out int count)
    45         {
    46             Console.WriteLine(name);
    47             count = name.Length;
    48         }
    49     }
    50 }

    test2.lua

     1 -- 如果DeBug中有luanet.dll文件,则不需要再次引用
     2 -- require "luanet"
     3 -- 加载CLR类型("命名空间")
     4 luanet.load_assembly("System")
     5 -- 加载命名空间下的类
     6 Int32 = luanet.import_type("System.Int32")
     7 -- 输出
     8 print(Int32)
     9 print('- - - - - - - - - - - - - - - - - - - - - - - - - - ')
    10 
    11 
    12 -- 加载CLR类型("命名空间"ChinarTest)
    13 luanet.load_assembly("TestLua")
    14 -- 加载命名空间下的类Program
    15 Pro=luanet.import_type("TestLua.Program")
    16 
    17 -- 实例化一个类对象
    18 pro=Pro()
    19 -- 输出
    20 print(pro.ChinarNum)
    21 
    22 -- 调用C#中的方法
    23 pro:ChinarTestFun()
    24 
    25 -- 调用Out方法,out参数不需要传入值,会直接返回类型为一个:表
    26 -- 由于C#那边是一个空返回值的方法,所以第一个返回为空
    27 -- 第二个返回 out参数
    28 void,stringCount=pro:TestOut("chinar.fun")
    29 print(void,stringCount)
    30 
    31 -- Ref参数
    32 void1,stringCount1=pro:TestRef("chinar.fun",8)
    33 print(void1,stringCount1)

    输出:

  • 相关阅读:
    前端必看的数据可视化入门指南
    win10下查看进程,杀死进程
    前端如何使用proxyTable和nginx解决跨域问题
    vue-wechat-title动态修改title
    npm与cnpm混用导致的问题
    sass与less对比学习
    nginx,作为前端的你会多少?
    Ubuntu16.04安装python3.7及相应的pip
    漫游Kafka设计篇之性能优化(7)
    漫游Kafka设计篇之消息传输的事务定义(5)
  • 原文地址:https://www.cnblogs.com/lyh916/p/12234143.html
Copyright © 2011-2022 走看看