2023年11月28日发(作者:)

Lua基本语法-luaC#的交互(相当简单详细的例⼦)

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

—— 全脚本数据

整个脚本项⽬

1C#脚本 2Lua脚本

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@

对于经本博主明确授权和许可使⽤⽂章及内容的,使⽤时请注明⽂章或内容出处并注明⽹址