Lua语言学习(五)Lua与C#的交互

Lua没有相应的类库支持,所以自然不会去用它编写一些大型程序和软件,一般我们使用lua是需要与重量级语言结合的,如C#、C++、Java等,这次我们来讲讲Lua是如何与C#进行交互的。


一、环境配置

      注: 我使用的是VS2013的环境,当然VS更高的版本也是一样的。

      开始先创建一个C#控制台应用程序,确保解决方案下有一个项目,嗯最初的准备工作可以了。

      C#想要与Lua发生关系,自然需要有什么工具将他们两个联系起来,这里的工具就是LuaInterface。

     1. 什么是LuaInterface?

         LuaInterface是一个开源的工程项目,他的作用就是将C#与Lua联系起来,这个工程项目中包含了两个dll文件,也就是动态链接库文件,文件中自然有封装好的操作函数,我们只要知道怎么使用他们就可以了。

        LuaInterface.dll:在C#中操作Lua所必需的依赖文件

        luanet.dll:Lua中操作C#所必需的依赖文件

    2. 设置LuaInterface

         先将这两个文件拷贝到你的项目文件下,嗯,就是在VS项目中直接粘贴着两个文件,拷贝完之后将这两个的文件的文件属性的复制到输出目录设置为“如果较新则复制”。

        接下来回到项目中,在项目下的引用中添加LuaInterface.dll,这时你当前项目文件的路径下应该就有这个文件了,因为现在是C#操作Lua,所以只要引用这一个就行了。

        在写代码之前要引入相应的命名空间:LuaInterface。


二、C#操作Lua

         1.C#执行Lua代码:

             语法重点:Lua 解析器对象.DoString(“Lua 代码”)             

static void Main(string[] args)
        {
            //实例化一个lua解析器
            Lua lua = new Lua();
                       
            lua.DoString("name = 'xiaoming' age = 19 sex = 'man'");
            lua.DoString("print(name, age, sex)");

            lua.DoString(@"for i = 1, 5, 1 do
                              print(i)
                           end");

            lua.DoString(@"function Show()
                               print('lua in cSharp')
                            end
                            Show()");

            lua.DoString(@"myArray = {'aaa', 'bbb', 'ccc', 'ddd'}
                            for i = 1, table.getn(myArray), 1 do
                                print(myArray[i])
                            end");
         }

最终启动程序,控制台会输出print中的结果。

不过一般我们不会直接在C#中写Lua代码,毕竟DoString()方法是有限制的:

①DoString()方法主要用于执行一些较短的 Lua 代码片段;

②DoString()方法执行过的代码,都会添加到 Lua 代码空间,在 Lua 代码文件中,是直接可以访问到这些代码的

总之DoString()用处不大,它并没有体现Lua的强大之处。


    2. C#内执行 Lua 文件:

        这才是重点,lua的强大和便利在这里才才让我们见识到冰山一角。

        我们直接加载Lua文件,C#最终是完成对lua文件的解析和利用。

        语法重点:Lua 解析器对象.DoFile(“[路径]Lua 文件.lua”)

        首先我们现在VS中写一份Lua文件:

                 ①添加->新建项->常规->文本文件,改名且后缀写为.lua

                注:但是这样创建出来的文件,文件格式是 UTF-8 BOM 类型,运行后会抛异常

                 ②使用 Notepad++之类的文本编辑器,在项目文件夹下打开lua文件,可以将文件格式修改

                注:UTF-8 类型,即可运行正常,但是这种文档类型不支持中文显示;ANSI 类型,中英文都都支持。

       现在我们写一份lua:

webname = '啦啦啦'
address = 'www.baidu.com'

pi = 3.14125

function ShowGame()
    print('hello  world')
end

function Add(a,b)
    return a + b
end

Ok,写完了,就只有一些基础字段和方法,我们看看怎么在C#中解析并使用他们

            //加载Lua文件,lua解析器已实例化
            lua.DoFile("wzq.lua");

            //获取lua文件中的字符类型
            string webName = lua.GetString("webname");
            string address = lua.GetString("address");
            //获取lua文件中的数值类型
            double pi = lua.GetNumber("pi");

            Console.WriteLine(webName + " " + address + " " + pi);

            //获取lua文件中的方法
            LuaFunction ShowGame = lua.GetFunction("ShowGame");
            //执行该方法
            ShowGame.Call();

            LuaFunction add = lua.GetFunction("Add");
            //向该方法传参
            Object[] obj = add.Call(12, 30);
            Console.WriteLine(obj[0]);

这之中的几个关键方法:

        ①GetString():取 Lua 脚本中的字符串数据

        ②GetNumber():取 Lua 脚本内的数值数据

        ③GetFunction():取 Lua 脚本内的函数,并执行

       好的,当你看到控制台输出正确了之后,别激动,下面才是主菜,让我们在文件资源管理器中打开该文件夹,进入到/bin/Debug路径下,这里有你刚才生成的exe可执行文件,直接启动它,会出现和刚才结果一样的控制台输出窗口,好的,前戏完毕。

       你会发下在Debug文件下还有你刚写的.lua文件,打开它,将address修改成‘ww.我改了这个.com’,保存关闭,再次运行exe执行文件,怎么样,很神奇吧,控制台输出也改了,以往我们想要修改exe的输出必须在编辑器中修改源代码,再次生成才行,现在只要修改.lua就可以轻松做到。


三、Lua操作C#

          既然是C#与Lua的交互,Lua操作C#也算礼尚往来嘛

          在独立的 Lua 脚本文件内,我们需要访问项目内已经存在的 C#脚本或类库,这些 C#脚本都是我们之前已经写好的,通过Lua可以对这些脚本进行修改、拓展等操作。

同样的在VS中创建一个.lua文件:

require("luanet")    --引入luanet.dll,该dll文件需与该lua文件在同一路径下

luanet.load_assembly("LuaWithCSharpTest")   --加载程序集(自己写的项目程序集)
luanet.load_assembly("System")              --加载程序集(C#内置的程序集)

Console = luanet.import_type("System.Console")    --获取System程序集下的Console类

Console.WriteLine("商品名:{0},价格:{1}","大刀",50)    --现在可以调用C#中的方法

必要步骤:

       ①导入 luanet.dll,语法格式:require “luanet”

           注:luanet.dll与该lua文件在同一文件目录下

       ②获取程序集,语法格式:luanet.load_assembly("程序集名")

       ③获取类型,语法格式:变量名 = luanet.import_type("程序集名.类名")

          注:这里的变量名等同于 C#中的类,可以通过变量名正常的访问类中的静态成员


这些就是关于C#与lua交互的基础,只是做到可以上手的程度,在实际的开发中早就有成熟的Lua框架去完成Unity的热更新,现在应用最广的两个框架ULua和XLua,这两个框架都是开源的,他们的底层实现都是依赖于C#与Lua交互的这些基础方法,希望这篇博客可以帮你较为轻松地入门Lua与C#的交互。


猜你喜欢

转载自blog.csdn.net/qq_37873310/article/details/80455827