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:\vsworkspace\luainterface\luainterface\bin\Debug文件下。并且编码格式一定要是ANSI。UTF-8在编译时会出错。

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

一、在C#中调用lua

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

 Lua lua = new Lua();    //创建lua解释器
lua["num"] = ; //定义一个num
lua["string"] = "Hello Lua "; //定义一个字符串
Console.WriteLine(lua["num"]);
Console.WriteLine(lua["string"]);
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脚本文件,或者脚本字符串

 

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

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

 //把一个类中的普通方法注册进去
Program p = new Program();
lua.RegisterFunction("LuaMethod", p, p.GetType().GetMethod("CLRMethod"));
lua.DoString("LuaMethod()");//执行这个方法 //把一个类的静态方法注册进去
lua.RegisterFunction("MyStaticMethod",null,typeof(Program).GetMethod("MyStaticMethod"))
lua.DoString(" MyStaticMethod()") //执行这个方法 public void CLRMethod()
{
Console.WriteLine("哈哈");
} public static void MyStaticMethod()
{
Console.WriteLine("这是静态方法");
}

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

 require "luanet"        --请求连接

 luanet.load_assembly("System")            --load_assembly 加载程序集
luanet.load_assembly("testluainterface") Int32 = luanet.import_type("System.Int32") --import_type 导入类型
Program = luanet.import_type("testluainterface.Program") num = Int32.Parse("") --print(Int32) --print(num) program1 = Program() --使用类型 --print(program1.name) --输出变量
--program1:TestMethod() --调用方法 --void, strlength = program1:TestOut("hahaha") --调用带有Out的方法
--print(void,strlength) --输出方法的返回值 和 out的返回值 C#的方法没有返回值这里也需要接收 会返回nil
void ,strlength = program1:TestRef("sahdjkhaskd",) --调用带有Ref的方法 需要给ref传值
print(void,strlength) --输出方法的返回值 和 ref的返回值

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

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

        public string name = "zhangli";

         public void TestMethod()
{
Console.WriteLine("TestMethod");
} public void TestOut(string name,out int count)
{
Console.WriteLine(name);
count = name.Length;
} public void TestRef(string name,ref int count)
{
Console.WriteLine(name );
Console.WriteLine(count);
count = name.Length;
}

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

         function method()

         end

         obj.SomeEvent:Add(methodname(不用带引号))

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

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

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

2016年12月15日17:30:16

上一篇:SSRS:之为用户“NT AUTHORITY\NETWORK SERVICE”授予的权限不足,无法执行此操作。 (rsAccessDenied)


下一篇:linux上的常用的进程与内存优化命令