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#的交互。