首页
学习
活动
专区
工具
TVP
发布

连通C#与lua

两种计算机语言沟通的需求

你可能觉得很奇怪,一个工程为什么要使用两种计算机语言?

如果说这是因为,主工程使用C#语言,运营活动之类经常需要更新的内容使用lua脚本,以便热更新,这样是不是听起来让一个工程使用两种计算机语言的需求瞬间变得迫在眉睫?

对于游戏项目来说,玩家不会被强制踢出服务器,不需要在游戏外部下载安装包,只要任意时间重启游戏时,读取一个进度条即可。如果担心玩家在更新安装包时流失,这绝对是一个绝佳的选择。

也许你会想,配表也可以热更呀。但配表只能完成数据的更新,如果刚公布出去的安装包发现有BUG,配表将束手无策,而这时lua作为脚本语言的灵活性就体现出来了。你甚至可以更换新的协议以修补功能BUG。

那么问题来了,C#语言与lua语言如何沟通呢?

tolua

这个章节的主要内容摘自官网(并不是真正意义上的官网)。

toLua home page

http://webserver2.tecgraf.puc-rio.br/~celes/tolua/tolua-3.2.html#availability

需要澄清下,这个网页并非官网,可以参考网页底部作者的Credits:

Luiz Henrique de Figueiredo had the idea of creating a tool to automaticallybind C code to Lua. L.H.F. wrote the very first version of such a tool(that bound C functions, variables, and constants) in awk. At thattime, I was only responsible for the C code that supported the generatedbinding code.

回到网页顶部,可以看到tolua的简介:

tolua is a tool that greatly simplifies the integration of C/C++code with Lua. Based ona cleaned header file, tolua automatically generatesthe binding code to access C/C++ features from Lua. Using Lua API and tagmethod facilities, tolua maps C/C++ constants, external variables,functions, classes, and methods to Lua.

tolua是一种让lua可以访问到C/C++的工具。

To use tolua, we create a package file, a C/C++ cleaned headerfile, listing the constants, variables, functions, classes, andmethods we want to export to the Lua environment. Then tolua parsesthis file and creates a C/C++ file that automatically binds the C/C++ codeto Lua. If we link the created file with our application, the specifiedC/C++ code can be accessed from Lua.

如何使用tolua?将需要暴露给lua的C/C++常量、变量、函数、类和方法记录在头文件中,使用tolua可将这些文件自动转化成lua可访问的C/C++文件。

tolua is composed by two pieces of code: an executable and a library.The executable represents the parser that reads a package file and outputa C/C++ code that implements the binding to access the C/C++ features fromLua.

tolua由两部分组成:一个可执行程序和一个库。可执行程序其实是一个转化器,执行需要一个包文件,这个包文件记录了需要公开给lua的C/C++代码,执行后会生成lua可访问的C/C++文件。

可在命令行中调用此执行文件,输入参数-h可查看帮助选项。

网页后部分的章节描述了lua中使用C/C++的具体细节,可以当做词典来查询。

tolua#

使用tolua之后,即可在lua中访问到C#代码。但仍旧有些需求完成起来很困难,这时我们想要在C#中访问lua代码。

这个章节的主要内容,摘自这篇博客。

tolua#代码简要分析 - CSDN博客

https://blog.csdn.net/meimeizhuzhuhua/article/details/70469673#commentBox

tolua#是Unity静态绑定lua的一个解决方案,它通过C#提供的反射信息分析代码并生成包装的类。它是一个用来简化在C#中集成lua的插件,可以自动生成用于在lua中访问Unity的绑定代码,并把C#中的常量、变量、函数、属性、类以及枚举暴露给lua。它是从cstolua衍变而来。从它的名字可以看出,它是集成了原来的tolua代码通过二次封装写了一个C#与tolua(c)的一个中间层。

值得注意的是,tolua#的核心运行时。

LuaAttribute.cs

它在tolua#生成绑定代码时做一些标示使用。

LuaBaseRef.cs

Lua中对象对应C#中对象的一个基类,业务代码中高频使用的LuaFunction,LuaTable,LuaThread均继承自这个类。主要作用是有一个reference指向lua里面的对象,引用计数判断两个对象是否相等等。

比如LuaFunction里面的reference是指向lua里面的一个闭包的,而LuaTable的reference是指向lua中的一个table的。

LuaDll.cs

这个类的主要作用就是实现了C#调用原生代码的功能。

LuaState.cs

这里面是对真正的lua_State的封装,包括初始化lua路径,加载相应的lua文件,注册我们前面生成的绑定代码以及各种辅助函数。

ObjectTranslator.cs

这个类代码不多,它存在的主要意义就是给lua中对C#对象的交互提供了基础,简单来说就是C#中的对象在传给lua时并不是直接把对象暴露给了lua,而是在这个OjbectTranslator里面注册并返回一个索引(可以理解为windows编程中的句柄),并把这个索引包装成一个userdata传递给lua,并且设置元表。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180623G122KJ00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券