2023年11月28日发(作者:)
Lua基本语法-lua与C#的交互(相当简单详细的例⼦)
lua脚本 与 C#的交互
本⽂提供全流程,中⽂翻译。
Chinar坚持将简单的⽣活⽅式,带给世⼈!
(拥有更好的阅读体验 —— ⾼分辨率⽤户请根据需求调整⽹页缩放⽐例)
1
Lua And C#
—— Lua 和 C#的交互准备⼯作
早期和 之间的交互,需要⽤Lua官⽅做好的接⼝等⽂件来实现
Lua C#
⽂件的下载直接跳转Lua官⽅⽹站:完成下载
点击链接 ↓↓
luainterface
点击链接 开始下载
1.5.3
下载完成后解压压缩⽂件,并打开⽂件夹
Built
⽬录中的3个⽂件:、、是暂时需要⽤到的
打开VS,创建⼀个控制台脚本
将下载好的⽂件拖到项⽬中
并按照步骤添加引⽤
图中我没有请⾃⼰添加上
using LuaInterface;
找到项⽬中的⽬录,并将下载好的、两个⽂件,拷贝到DeBug⽂件⽬录中
2
C# Create Lua
—— ⽤C#在lua环境中编写lua
⽤简单的控制台程序 测试,输出
using System;
using LuaInterface; //引⽤命名空间
namespace ChinarTest
{
///
/// 测试类
///
class Program
{
static void Main(string[] args)
{
Lua lua = new Lua(); //创建⼀个lua解释器
lua["num"] = 66; //⽤C#脚本在lua环境中,创建⼀个变量
lua["str"] = "chinar"; //⽤C#脚本在lua环境中,创建⼀个字符串变量
ine(lua["num"]); //输出
ine(lua["str"]); //输出
y(); //等待输⼊
}
}
}
输出结果:
66
chinar
3
ng
—— 在C#脚本中编写Lua脚本
ng()
⽤于创建代码段
using System;
using LuaInterface; //引⽤命名空间
namespace ChinarTest
{
///
/// 测试类
///
class Program
{
static void Main(string[] args)
{
Lua lua = new Lua(); //创建⼀个lua解释器
ng("num=666"); //⽤C#脚本在lua环境中,创建⼀段lua脚本:num=666
ng("str='chianr666'"); //⽤C#脚本在lua环境中,创建⼀段lua脚本:str='chianr666'
object[] values = ng("return num,str"); //⽤⼀个object数组 去接受返回值
foreach (var value in values) //遍历 values 数组中的元素
{
ine(value); //输出
}
y(); //等待输⼊
}
}
}
输出结果:
666
chianr666
4
—— ⽤C#加载Lua脚本⽂件
()
⽤于找到⽬录中的Lua⽂件,并加载
需要将写好的Lua⽂件拖到项⽬中,并且修改属性为 :如果较新则复制 / 始终复制
否则会出现找不到⽂件的 报错信息
不会的请看下图
using System;
using LuaInterface; //引⽤命名空间
namespace ChinarTest
{
///
/// 测试类
///
class Program
{
static void Main(string[] args)
{
Lua lua = new Lua(); //创建⼀个lua解释器
(""); //加载lua⽂件 —— (⽂件名)
y(); //等待输⼊
}
}
}
下边是⽂件
print('I am Chianr')
MyTable={1,22,333,4444,55555,666666}
print((MyTable)..'I am Chianr')
输出结果:
I am Chianr
5555666666I am Chianr
5
erFunction
—— 将C#中的函数/⽅法 写⼊到Lua脚本中
erFunction()
⽤于将C#中的函数/⽅法 写⼊到Lua脚本中
注册⽅法
erFunction
(注册到Lua中以后⽅法的名称,程序对象,程序的类型e().(传⼊C#中的⽅法名:需要是公有⽅法))
注册静态⽅法
erFunction
(注册到Lua中以后⽅法的名称,空,程序的类型 typeof(Program).(传⼊C#中的⽅法名:需要是公有⽅法))
注册的⽅法必须是 public ,否则会找不到
using System;
using LuaInterface; //引⽤命名空间
namespace ChinarTest
{
///
/// 测试类
///
class Program
{
static void Main(string[] args)
{
Lua lua = new Lua(); //创建⼀个lua解释器
Program program = new Program(); //声明⼀个对象
//erFunction 注册⽅法(注册到Lua中以后⽅法的名称,程序对象,程序的类型e().(传⼊C#中的⽅法名:需要是公有⽅法))
erFunction("LuaChinarTest", program, e().GetMethod("ChinarTest"));
//然后⽤ng(Lua中⽅法名())调⽤测试
ng("LuaChinarTest()");
//erFunction 注册静态⽅法(注册到Lua中以后⽅法的名称,空,程序的类型 typeof(Program).(传⼊C#中的⽅法名:需要是公有⽅法))
erFunction("LuaChinarStaticTest", null, typeof(Program).GetMethod("ChinarStaticTest"));
//然后⽤ng(Lua中静态⽅法名())调⽤测试
ng("LuaChinarStaticTest()");
y(); //等待输⼊
}
///
/// ⼀个测试⽅法
///
public void ChinarTest()
{
ine("这是⼀个空⽅法");
}
///
输出结果:
这是⼀个空⽅法
这个⼀个静态空⽅法
6
require
—— Lua中引⽤C#中的类
Lua C#
调⽤的类需要:和
DeBug
拷贝到⼯程输出⽬录中
lua require
脚本中就不需要使⽤和了
这点,在第⼀步 配置引⽤信息的时候,就做过了,如果没有做的报错了。请返回第⼀步
报错点1:
require “luanet” :如果DeBug中有⽂件,则不需要在Lua脚本中再次引⽤
否则会报错:
“eption”类型的未经处理的异常在 中发⽣,其他信息: error loading module ‘luanet’ from file ‘.’
报错点2:
另外,修改的属性后,⼀定要保存,不然还会报错找不到⽂件
using System;
using LuaInterface; //引⽤命名空间
namespace ChinarTest
{
///
/// 测试类
///
class Program
{
static void Main(string[] args)
{
Lua lua = new Lua(); //创建⼀个lua解释器
(""); //Lua引⽤C#中的类
y(); //等待输⼊
}
public int ChinarNum = 60; //整形变量
public string Name = "Chinar"; //字符串变量
///
/// ⽤来让Lua脚本测试的⽅法
///
public void ChinarTestFun()
{
ine("你好,Chinar");
}
///
/// Ref⽅法,参数
///
///
///
public void TestRef(string name, ref int count)
{
ine(name);
ine(count);
count = ;
7
All
—— 全脚本数据
整个脚本项⽬
1个C#脚本 2个Lua脚本
using System;
using LuaInterface; //引⽤命名空间
namespace ChinarTest
{
///
/// 测试类
///
class Program
{
static void Main(string[] args)
{
Lua lua = new Lua(); //创建⼀个lua解释器
lua["num"] = 66; //⽤C#脚本在lua环境中,创建⼀个变量
lua["str"] = "chinar"; //⽤C#脚本在lua环境中,创建⼀个字符串变量
ine(lua["num"]); //输出
ine(lua["str"]); //输出
ng("num=666"); //⽤C#脚本在lua环境中,创建⼀段lua脚本:num=666
ng("str='chianr666'"); //⽤C#脚本在lua环境中,创建⼀段lua脚本:str='chianr666'
object[] values = ng("return num,str"); //⽤⼀个object数组 去接受返回值
foreach (var value in values) //遍历 values 数组中的元素
{
ine(value); //输出
}
(""); //加载lua⽂件 —— (⽂件名)
Program program = new Program(); //声明⼀个对象
//erFunction 注册⽅法(注册到Lua中以后⽅法的名称,程序对象,程序的类型e().(传⼊C#中的⽅法名:需要是公有⽅法))
erFunction("LuaChinarTest", program, e().GetMethod("ChinarTest"));
//然后⽤ng(Lua中⽅法名())调⽤测试
ng("LuaChinarTest()");
//erFunction 注册静态⽅法(注册到Lua中以后⽅法的名称,空,程序的类型 typeof(Program).(传⼊C#中的⽅法名:需要是公有⽅法))
erFunction("LuaChinarStaticTest", null, typeof(Program).GetMethod("ChinarStaticTest"));
//然后⽤ng(Lua中静态⽅法名())调⽤测试
ng("LuaChinarStaticTest()");
(""); //Lua引⽤C#中的类
y(); //等待输⼊
}
///
/// ⼀个测试⽅法
///
public void ChinarTest()
{
ine("这是⼀个空⽅法");
}
///
/// ⼀个静态测试⽅法
///
public static void ChinarStaticTest()
{
ine("这个⼀个静态空⽅法");
}
public int ChinarNum = 60; //整形变量
public string Name = "Chinar"; //字符串变量
///
/// ⽤来让Lua脚本测试的⽅法
///
public void ChinarTestFun()
{
ine("你好,Chinar");
}
///
/// Ref⽅法,参数
///
///
///
public void TestRef(string name, ref int count)
{
ine(name);
ine(count);
count = ;
}
///
/// Out⽅法,参数
///
///
///
public void TestOut(string name, out int count)
{
ine(name);
count = ;
}
}
}
⽂件
print('I am Chianr')
MyTable={1,22,333,4444,55555,666666}
print((MyTable)..'I am Chianr')
⽂件
-- 如果DeBug中有⽂件,则不需要再次引⽤
-- require "luanet"
-- 加载CLR类型("命名空间")
_assembly("System")
-- 加载命名空间下的类
Int32 = _type("32")
-- 输出
print(Int32)
print('- - - - - - - - - - - - - - - - - - - - - - - - - - ')
-- 加载CLR类型("命名空间"ChinarTest)
_assembly("ChinarTest")
-- 加载命名空间下的类Program
Pro=_type("m")
-- 实例化⼀个类对象
pro=Pro()
-- 输出
print(Num)
-- 调⽤C#中的⽅法
pro:ChinarTestFun()
-- 调⽤Out⽅法,out参数不需要传⼊值,会直接返回类型为⼀个:表
-- 由于C#那边是⼀个空返回值的⽅法,所以第⼀个返回为空
-- 第⼆个返回 out参数
void,stringCount=pro:TestOut("")
print(void,stringCount)
-- Ref参数
void1,stringCount1=pro:TestRef("",8)
print(void1,stringCount1)
输出结果:
66
chinar
666
chianr666
I am Chianr
5555666666I am Chianr
这是⼀个空⽅法
这个⼀个静态空⽅法
ProxyType(32): 12289376
- - - - - - - - - - - - - - - - - - - - - - - - - -
60
你好,Chinar
Chinar
直接Down下来运⾏即可
END
本博客为⾮营利性个⼈原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本⼈所拥有,本⼈保留所
有法定权利。违者必究
对于需要复制、转载、链接和传播博客⽂章或内容的,请及时和本博主进⾏联系,留⾔,Email: ichinar@
对于经本博主明确授权和许可使⽤⽂章及内容的,使⽤时请注明⽂章或内容出处并注明⽹址
发布评论