zoukankan      html  css  js  c++  java
  • Lua学习笔记(一)-----C#和lua的交互

    一直以来对Lua热更新技术很感兴趣,在上周开始了对Lua的学习,主要学的是uLua。

    直接上干货

    准备工作:

      LuaInterface包括两个核心库一个是LuaInterface.dll,一个是Luanet.dll,我们可以通过LuaInterface完成Lua和C#(CLR)之间的互相调用

      需要在vs的工程中导入两个dll分别是LuaInterface.dll和luanet.dll,前者是vs调用lua时需要引用,并在vs的工程中引入命名空间using LuaInterface;引用以后就可以创建lua的解释器,来执行lua代码。

    lua代码的脚本需要放在vs工程的输出环境下即E:vsworkspaceluainterfaceluainterfaceinDebug文件下。并且编码格式一定要是ANSI。UTF-8在编译时会出错。

      luanet.dll是在lua脚本中调用vs的方法或变量时需要引入,require “luanet” 并且需要将该dll放在vs工程的输出环境下,即E:vsworkspaceluainterfaceluainterfaceinDebug文件下。

    一、在C#中调用lua

    1、在C#中执行lua代码。

    1 Lua lua = new Lua();    //创建lua解释器
    2  lua["num"] = 33;        //定义一个num
    3  lua["string"] = "Hello Lua  ";   //定义一个字符串 
    4  Console.WriteLine(lua["num"]);
    5  Console.WriteLine(lua["string"]);
    6  Console.ReadKey();

    2、访问lua环境中的变量

    double num = (double)lua["num"];

    string str = (string)lua["str"];

    说一下lua变量类型和c#中变量类型的对应

    nil         null

    string           System.String

    number     System.Double

    boolean     System.Boolean

    table      LuaInterface.LuaTable

    Function        LuaInterface.LuaFunction

     3、在C#中执行Lua脚本文件,或者脚本字符串

     

     1  Lua lua = new Lua();    //创建lua解释器
     2             //lua.DoString("xxxxxxxxxx");  里边写的字符串就相当于lua脚本中的代码
     3             lua.DoString("num=2");
     4             lua.DoString("str = 'a string'");
     5 
     6             object[] strs = lua.DoString("return num,str");
     7 
     8             foreach (object item in strs)
     9             {
    10                 Console.WriteLine(item);
    11             }    
    1 Lua lua = new Lua();    //创建lua解释器
    2 lua.DoFile("myLua.lua");//这个lua脚本需要放在vs的bin/debug文件夹下

    4、把一个C#方法注册进Lua的一个全局方法

     1 //把一个类中的普通方法注册进去
     2 Program p = new Program();
     3 lua.RegisterFunction("LuaMethod", p, p.GetType().GetMethod("CLRMethod"));
     4 lua.DoString("LuaMethod()");//执行这个方法
     5    
     6 
     7 //把一个类的静态方法注册进去
     8 lua.RegisterFunction("MyStaticMethod",null,typeof(Program).GetMethod("MyStaticMethod"))
     9 lua.DoString(" MyStaticMethod()")      //执行这个方法
    10 
    11 
    12   public void CLRMethod()
    13         {
    14             Console.WriteLine("哈哈");
    15         }
    16 
    17         public static void MyStaticMethod()
    18         {
    19             Console.WriteLine("这是静态方法");
    20         }

    二、在Lua中使用c#中的类 这是lua中的代码

     1 require "luanet"        --请求连接
     2 
     3 luanet.load_assembly("System")            --load_assembly 加载程序集
     4 luanet.load_assembly("testluainterface")
     5 
     6 
     7 Int32 = luanet.import_type("System.Int32")            --import_type  导入类型
     8 Program = luanet.import_type("testluainterface.Program")
     9 
    10 num = Int32.Parse("123456")        
    11 
    12 --print(Int32)        
    13 
    14 --print(num)
    15 
    16 program1 = Program()            --使用类型
    17 
    18 --print(program1.name)            --输出变量
    19 --program1:TestMethod()            --调用方法
    20 
    21 --void, strlength = program1:TestOut("hahaha")        --调用带有Out的方法
    22 --print(void,strlength)            --输出方法的返回值 和 out的返回值  C#的方法没有返回值这里也需要接收 会返回nil
    23 void ,strlength = program1:TestRef("sahdjkhaskd",10)        --调用带有Ref的方法 需要给ref传值
    24 print(void,strlength)            --输出方法的返回值 和 ref的返回值

    lua脚本写好之后在C#中使用lua.DoFile("脚本的名字.lua")进行调用就会执行lua这个脚本即可。

    在C#中对应的在Program类中的一些方法如下

     1        public string name = "zhangli";
     2 
     3         public void TestMethod()
     4         {
     5             Console.WriteLine("TestMethod");
     6         }
     7 
     8         public void TestOut(string name,out int count)
     9         {
    10             Console.WriteLine(name);
    11             count = name.Length;
    12         }
    13 
    14         public void  TestRef(string name,ref int count)
    15         {
    16             Console.WriteLine(name  );
    17             Console.WriteLine(count);
    18             count = name.Length;
    19         }

     三、在Lua中通过Add方法或者Remove方法把一个Lua的函数注册或者注销从C#中的事件委托中

    3         function method()
    4 
    5         end
    6 
    7         obj.SomeEvent:Add(methodname(不用带引号))

    根据学习进度今天分享这些基础内容。后续会继续学习。欢迎批评指正,共同学习。

     欢迎广大博友加群学习165628892(进群备注:博客)  随时提出问题解决问题!

    树欲静而风不止,子欲养而亲不待

    2016年12月15日17:30:16

  • 相关阅读:
    VijosP1274:神秘的咒语
    2009年浙大 :找出直系亲属
    django用户信息扩展
    缓存
    自定义认证
    自定义admin
    权限的配置和使用
    form表单
    过滤器 自定义查询
    中间件
  • 原文地址:https://www.cnblogs.com/unityzc/p/6184120.html
Copyright © 2011-2022 走看看