C#和lua相互调⽤的⽅法教程
前⾔
⾃从ulua在官⽹上出来后,lua 就被u3d开发⼈员喜爱。国内有⼏个⾼⼿把lua拿过来 接着进⾏了封装。很多都是新⼿转过来。lua语法⼀看遍知,但是⼤多数⼈还是不明⽩两个语⾔之间的互相调⽤是怎么⼀回事,这也是难点和重点。所以今天想跟⼤家分享⼀下这⽅⾯的知识,让⼤家少⾛弯路吧。
Lua是⼀种很好的扩展性语⾔,Lua解释器被设计成⼀个很容易嵌⼊到宿主程序的库。LuaInterface则⽤于实现Lua和CLR的混合编程。
C与lua交互⾯临以下⼏个问题:
1、由于lua⾥⾯的数据都是动态加载的所以内存也是动态分配的,也没有static 这样的修饰,⽽C⾥⾯有 static const 这样的静态类型数据
2、c⾥⾯是⼿动管理内存lua ⾥⾯是⾃动管理内存
所以为了解决这些问题就采⽤了⼀个抽象栈来让lua与c交换值,好⽐c⾥⾯的 void* 可以指向任何地址⽽不⽤管存储类型。这样两边都不管你传的何种类型的参数,只⽤知道它是⼀个地址指针。两边⽤的时候再强制转换成对应的类型。
下⾯开始本⽂的正⽂吧。
(⼀)C#调⽤Lua
测试环境:在VS2015中建⼀个C#控制台应⽤程序,并添加LuaInterface.dll的引⽤
LuaInterface.Lua类是CLR访问Lua解释器的主要接⼝,⼀个LuaInterface.Lua类对象就代表了⼀个Lua解释器(或Lua执⾏环境),Lua解释器可以同时存在多个,并且它们之间是完全相互独⽴的。
简单说明下步骤:
在根⽬录处添加LuaInterface.dll的引⽤:
不啰嗦、直接上代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LuaInterface;
namespace CSharpToLua
{
class Program
{
static void Main(string[] args)
{
// 新建⼀个Lua解释器,每⼀个Lua实例都相互独⽴, ⼀个global全局域
Lua lua = new Lua();
/
/---------------------------------------------------
// Lua的索引操作[]可以创建、访问、修改global域
lua["age"] = 20;
lua["name"] = "Mr.huang";
string luaCode = "print(\"This is Lua code\")";
lua.DoString(luaCode);//执⾏lua脚本代码
lua.DoFile("F:\\CSharpToLua\\CSharpToLua\\ScriptsFromFile.lua");//执⾏lua脚本⽂件,这⾥我直接⽤了绝对定位 double age = (double)lua["age"];
Console.WriteLine("age = {0}", age);
Console.WriteLine("width = {0}", lua["width"]);
Console.ReadKey();
}
}
}
可以跟着敲⼀遍,提⾼与代码的亲密度 ~.~ And then 点击启动
咦、这时会出现⼀个报错、但是不要紧、
解决⽅案:
再次运⾏、就可以看到结果啦、惊不惊喜、意不意外
简单的介绍C#如何调⽤Lua代码、当然、还有很多丰富的API⼩伙伴们可以⾃⾏查阅哟。(⼆)Lua调⽤C#
直接上代码 ~.~
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LuaInterface;
namespace CSharpToLua
{
writeline教程class Program
{
static void Main(string[] args)
{
// 新建⼀个Lua解释器,每⼀个Lua实例都相互独⽴, ⼀个global全局域
Lua lua = new Lua();
//---------------------------------------------------lua调⽤c#函数
TestClass obj = new TestClass();
// 注册CLR对象⽅法到Lua,供Lua调⽤ typeof(TestClass).GetMethod("TestPrint")
lua.RegisterFunction("TestPrint", obj, obj.GetType().GetMethod("TestPrint"));
// 注册CLR静态⽅法到Lua,供Lua调⽤
lua.RegisterFunction("TestStaticPrint", null, typeof(TestClass).GetMethod("TestStaticPrint"));
lua.DoString("TestPrint(10)");
lua.DoString("TestStaticPrint()");
Console.ReadKey();
}
}
class TestClass
{
private int value = 0;
public void TestPrint(int num)
{
value = num;
Console.WriteLine("CSharp"+value);
}
public static void TestStaticPrint()
{
Console.WriteLine("TestStaticPrint");
}
}
}
点击运⾏.................
perfect~.~ 当然、这⾥只是简单的介绍C#与Lua是如何相互调⽤的、⼩伙伴可⾃⾏Google⼤量丰富的API⽅便开发哟
重要的事要说三遍:LuaInterface是主要接⼝、LuaInterface是主要接⼝、LuaInterface是主要接⼝
总结
以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,如果有疑问⼤家可以留⾔交流,谢谢⼤家对的⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论