lua脚本 与 C#的交互


本文提供全流程,中文翻译。

Chinar坚持将简单的生活方式,带给世人!

(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例)


  • 1

    • Lua And C# —— Lua 和 C#的交互准备工作
  • 2
    • C# Create Lua —— 用C#在lua环境中编写lua
  • 3
    • lua.DoString —— 在C#脚本中编写Lua脚本
  • 4
    • lua.DoFile —— 用C#加载Lua脚本文件
  • 5
    • lua.RegisterFunction —— 将C#中的函数/方法 写入到Lua脚本中
  • 6
    • require —— Lua中引用C#中的类
  • 7
    • All —— 全脚本数据
  • 8
    • Error —— 常见报错点

1

Lua And C# —— Lua 和 C#的交互准备工作

早期 Lua 和 C# 之间的交互,需要用Lua官方做好的接口 LuaInterface.dll 等文件来实现

文件的下载直接跳转Lua官方网站:LuaInterface完成下载

点击 luainterface 链接 ↓↓

点击 1.5.3 链接 开始下载

下载完成后解压压缩文件,并打开 Built 文件夹

目录中的3个文件: lua51.dll 、 LuaInterface.dll 、 luanet.dll 是暂时需要用到的

打开VS,创建一个控制台脚本

将下载好的 LuaInterface.dll 文件拖到项目中

并按照步骤添加引用

图中我没有 using LuaInterface; 请自己添加上

找到项目中的目录,并将下载好的 lua51.dll 、 luanet.dll 两个文件,拷贝到DeBug文件目录中


2

C# Create Lua —— 用C#在lua环境中编写lua

用简单的控制台程序 测试,输出

using System;
using LuaInterface; //引用命名空间namespace ChinarTest
{/// <summary>/// 测试类/// </summary>class Program{static void Main(string[] args) {Lua lua    = new Lua();        //创建一个lua解释器lua["num"] = 66;               //用C#脚本在lua环境中,创建一个变量lua["str"] = "chinar";         //用C#脚本在lua环境中,创建一个字符串变量Console.WriteLine(lua["num"]); //输出Console.WriteLine(lua["str"]); //输出Console.ReadKey();             //等待输入}}
}

输出结果:

66
chinar

3

lua.DoString —— 在C#脚本中编写Lua脚本

lua.DoString() 用于创建代码段

using System;
using LuaInterface; //引用命名空间namespace ChinarTest
{/// <summary>/// 测试类/// </summary>class Program{static void Main(string[] args){Lua lua = new Lua();                              //创建一个lua解释器lua.DoString("num=666");                          //用C#脚本在lua环境中,创建一段lua脚本:num=666lua.DoString("str='chianr666'");                  //用C#脚本在lua环境中,创建一段lua脚本:str='chianr666'object[] values = lua.DoString("return num,str"); //用一个object数组 去接受返回值foreach (var value in values)                     //遍历 values 数组中的元素{Console.WriteLine(value); //输出}Console.ReadKey(); //等待输入}}
}

输出结果:

666
chianr666

4

lua.DoFile —— 用C#加载Lua脚本文件

lua.DoFile() 用于找到目录中的Lua文件,并加载

需要将写好的Lua文件拖到项目中,并且修改属性为 :如果较新则复制 / 始终复制

否则会出现找不到文件的 报错信息

不会的请看下图

using System;
using LuaInterface; //引用命名空间namespace ChinarTest
{/// <summary>/// 测试类/// </summary>class Program{static void Main(string[] args){Lua lua = new Lua();      //创建一个lua解释器lua.DoFile("Chinar.lua"); //加载lua文件 —— lua.DoFile(文件名)Console.ReadKey();        //等待输入}}
}

下边是 Chinar.lua 文件

print('I am Chianr')
MyTable={1,22,333,4444,55555,666666}
print(table.concat(MyTable)..'I am Chianr')

输出结果:

I am Chianr
122333444455555666666I am Chianr

5

lua.RegisterFunction —— 将C#中的函数/方法 写入到Lua脚本中

lua.RegisterFunction() 用于将C#中的函数/方法 写入到Lua脚本中

注册方法
lua.RegisterFunction (注册到Lua中以后方法的名称,程序对象,程序的类型program.GetType().(传入C#中的方法名:需要是公有方法))

注册静态方法
lua.RegisterFunction (注册到Lua中以后方法的名称,空,程序的类型 typeof(Program).(传入C#中的方法名:需要是公有方法))

注册的方法必须是 public ,否则会找不到

using System;
using LuaInterface; //引用命名空间namespace ChinarTest
{/// <summary>/// 测试类/// </summary>class Program{static void Main(string[] args){Lua     lua     = new Lua();     //创建一个lua解释器Program program = new Program(); //声明一个对象//lua.RegisterFunction 注册方法(注册到Lua中以后方法的名称,程序对象,程序的类型program.GetType().(传入C#中的方法名:需要是公有方法))lua.RegisterFunction("LuaChinarTest", program, program.GetType().GetMethod("ChinarTest"));//然后用lua.DoString(Lua中方法名())调用测试lua.DoString("LuaChinarTest()");//lua.RegisterFunction 注册静态方法(注册到Lua中以后方法的名称,空,程序的类型 typeof(Program).(传入C#中的方法名:需要是公有方法))lua.RegisterFunction("LuaChinarStaticTest", null, typeof(Program).GetMethod("ChinarStaticTest"));//然后用lua.DoString(Lua中静态方法名())调用测试lua.DoString("LuaChinarStaticTest()");Console.ReadKey(); //等待输入}/// <summary>/// 一个测试方法/// </summary>public void ChinarTest(){Console.WriteLine("这是一个空方法");}/// <summary>/// 一个静态测试方法/// </summary>public static void ChinarStaticTest(){Console.WriteLine("这个一个静态空方法");}}
}

输出结果:

这是一个空方法
这个一个静态空方法

6

require —— Lua中引用C#中的类

Lua 调用 C# 的类需要: LuaInterface.dll 和 luanet.dll

luanet.dll 拷贝到工程 DeBug 输出目录中

lua 脚本中就不需要使用 package.cpath 和 require 了

这点,在第一步 配置引用信息的时候,就做过了,如果没有做的报错了。请返回第一步

报错点1:
require “luanet” :如果DeBug中有luanet.dll文件,则不需要在Lua脚本中再次引用

否则会报错:
“LuaInterface.LuaException”类型的未经处理的异常在 LuaInterface.dll 中发生,其他信息: error loading module ‘luanet’ from file ‘.\luanet.dll’

报错点2:
另外,修改 ChinarClass.lua 的属性后,一定要保存,不然还会报错找不到文件

using System;
using LuaInterface; //引用命名空间namespace ChinarTest
{/// <summary>/// 测试类/// </summary>class Program{static void Main(string[] args){Lua lua = new Lua();           //创建一个lua解释器lua.DoFile("ChinarClass.lua"); //Lua引用C#中的类Console.ReadKey();             //等待输入}public int    ChinarNum = 60;       //整形变量public string Name      = "Chinar"; //字符串变量/// <summary>/// 用来让Lua脚本测试的方法/// </summary>public void ChinarTestFun(){Console.WriteLine("你好,Chinar");}/// <summary>/// Ref方法,参数/// </summary>/// <param name="name"></param>/// <param name="count"></param>public void TestRef(string name, ref int count){Console.WriteLine(name);Console.WriteLine(count);count = name.Length;}/// <summary>/// Out方法,参数/// </summary>/// <param name="name"></param>/// <param name="count"></param>public void TestOut(string name, out int count){Console.WriteLine(name);count = name.Length;}}
}

输出结果:

ProxyType(System.Int32): 46104728
- - - - - - - - - - - - - - - - - - - - - - - - - -
60
你好,Chinar
chinar.fun
nil     10
chinar.fun
8
nil     10

7

All —— 全脚本数据

整个脚本项目

1个C#脚本 2个Lua脚本

using System;
using LuaInterface; //引用命名空间namespace ChinarTest
{/// <summary>/// 测试类/// </summary>class Program{static void Main(string[] args){Lua lua = new Lua(); //创建一个lua解释器lua["num"] = 66;               //用C#脚本在lua环境中,创建一个变量lua["str"] = "chinar";         //用C#脚本在lua环境中,创建一个字符串变量Console.WriteLine(lua["num"]); //输出Console.WriteLine(lua["str"]); //输出lua.DoString("num=666");                          //用C#脚本在lua环境中,创建一段lua脚本:num=666lua.DoString("str='chianr666'");                  //用C#脚本在lua环境中,创建一段lua脚本:str='chianr666'object[] values = lua.DoString("return num,str"); //用一个object数组 去接受返回值foreach (var value in values)                     //遍历 values 数组中的元素{Console.WriteLine(value); //输出}lua.DoFile("Chinar.lua"); //加载lua文件 —— lua.DoFile(文件名)Program program = new Program(); //声明一个对象//lua.RegisterFunction 注册方法(注册到Lua中以后方法的名称,程序对象,程序的类型program.GetType().(传入C#中的方法名:需要是公有方法))lua.RegisterFunction("LuaChinarTest", program, program.GetType().GetMethod("ChinarTest"));//然后用lua.DoString(Lua中方法名())调用测试lua.DoString("LuaChinarTest()");//lua.RegisterFunction 注册静态方法(注册到Lua中以后方法的名称,空,程序的类型 typeof(Program).(传入C#中的方法名:需要是公有方法))lua.RegisterFunction("LuaChinarStaticTest", null, typeof(Program).GetMethod("ChinarStaticTest"));//然后用lua.DoString(Lua中静态方法名())调用测试lua.DoString("LuaChinarStaticTest()");lua.DoFile("ChinarClass.lua"); //Lua引用C#中的类Console.ReadKey(); //等待输入}/// <summary>/// 一个测试方法/// </summary>public void ChinarTest(){Console.WriteLine("这是一个空方法");}/// <summary>/// 一个静态测试方法/// </summary>public static void ChinarStaticTest(){Console.WriteLine("这个一个静态空方法");}public int    ChinarNum = 60;       //整形变量public string Name      = "Chinar"; //字符串变量/// <summary>/// 用来让Lua脚本测试的方法/// </summary>public void ChinarTestFun(){Console.WriteLine("你好,Chinar");}/// <summary>/// Ref方法,参数/// </summary>/// <param name="name"></param>/// <param name="count"></param>public void TestRef(string name, ref int count){Console.WriteLine(name);Console.WriteLine(count);count = name.Length;}/// <summary>/// Out方法,参数/// </summary>/// <param name="name"></param>/// <param name="count"></param>public void TestOut(string name, out int count){Console.WriteLine(name);count = name.Length;}}
}

Chinar.lua 文件

print('I am Chianr')
MyTable={1,22,333,4444,55555,666666}
print(table.concat(MyTable)..'I am Chianr')

ChinarClass.lua 文件

-- 如果DeBug中有luanet.dll文件,则不需要再次引用
-- require "luanet"
-- 加载CLR类型("命名空间")
luanet.load_assembly("System")
-- 加载命名空间下的类
Int32 = luanet.import_type("System.Int32")
-- 输出
print(Int32)
print('- - - - - - - - - - - - - - - - - - - - - - - - - - ')-- 加载CLR类型("命名空间"ChinarTest)
luanet.load_assembly("ChinarTest")
-- 加载命名空间下的类Program
Pro=luanet.import_type("ChinarTest.Program")-- 实例化一个类对象
pro=Pro()
-- 输出
print(pro.ChinarNum)-- 调用C#中的方法
pro:ChinarTestFun()-- 调用Out方法,out参数不需要传入值,会直接返回类型为一个:表
-- 由于C#那边是一个空返回值的方法,所以第一个返回为空
-- 第二个返回 out参数
void,stringCount=pro:TestOut("chinar.fun")
print(void,stringCount)-- Ref参数
void1,stringCount1=pro:TestRef("chinar.fun",8)
print(void1,stringCount1)

输出结果:

66
chinar
666
chianr666
I am Chianr
122333444455555666666I am Chianr
这是一个空方法
这个一个静态空方法
ProxyType(System.Int32): 12289376
- - - - - - - - - - - - - - - - - - - - - - - - - -
60
你好,Chinar
chinar.fun
nil     10
chinar.fun
8
nil     10

8

Error —— 常见报错点

报错点1:
require “luanet” :如果DeBug中有luanet.dll文件,则不需要在Lua脚本中再次引用

否则会报错:
“LuaInterface.LuaException”类型的未经处理的异常在 LuaInterface.dll 中发生,其他信息: error loading module ‘luanet’ from file ‘.\luanet.dll’

报错点2:
另外,修改 ChinarClass.lua 的属性后,一定要保存,不然还会报错找不到文件

报错点3:
注册的方法必须是 public ,否则会找不到

报错点4:
需要将写好的Lua文件拖到项目中,并且修改属性为 :如果较新则复制 / 始终复制

否则会出现找不到文件的 报错信息

报错点5:
找到项目中的目录,并将下载好的 lua51.dll 、 luanet.dll 两个文件,拷贝到DeBug文件目录中

这一步,在第一步就做好,一步到位!



Chinar

Chinar的GitHub工程案例

直接Down下来运行即可


END

本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究

对于需要复制、转载、链接和传播博客文章或内容的,请及时和本博主进行联系,留言,Email: ichinar@icloud.com

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

转载于:https://www.cnblogs.com/chinarbolg/p/9601452.html

Lua基本语法-lua与C#的交互(相当简单详细的例子)相关推荐

  1. [Lua语言编程]Lua语言基础知识

    文章目录 `Lua` `Lua`语言的起源 `Lua` 特性 `Lua下载` Linux 系统上安装 Mac OS X 系统上安装 Window 系统上安装 `Lua` `Lua`语言语法 `Lua` ...

  2. Lua基本语法-书写规范以及自带常用函数

    Lua基本语法-书写规范和常用函数 本文提供全流程,中文翻译. Chinar坚持将简单的生活方式,带给世人! (拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 String O ...

  3. Lua脚本语法说明(修订)

    Lua脚本语法说明(增加lua5.1部份特性) Lua 的语法比较简单,学习起来也比较省力,但功能却并不弱. 所以,我只简单的归纳一下Lua的一些语法规则,使用起来方便好查就可以了.估计看完了,就懂得 ...

  4. Lua之Lua安装与Lua变量-TTLSA(一)

    为什么80%的码农都做不了架构师?>>>    公司业务有用到Lua,与nginx结合起来实现高性能的web应用,想去弄懂这方面的知识,就去了解学习了下Lua,欢迎大咔们指教. 1. ...

  5. 对应猎豹网校的lua 视频教程 做的学习记录 前三课简单介绍1-3

    假设有一个1.lua 位置在 c:\Users\Administrator\Documents\lua\1.luafunction fact(n)if n==0 thenreturn 1elseret ...

  6. Lua:01---Lua语言介绍、运行Lua程序(lua解释器)

    一.Lua语言介绍 Lua语言从一开始就被设计为能与C/C++及其他常用语言开发的软件集成在一起使用的语言,这种设计带来了非常多的好处: 一方面, Lua语言不需要在性能.与三方软件交互等C语言已经非 ...

  7. lua—C/C++lua嵌入式开发

    lua-C/C++lua嵌入式开发 一.lua定位--C/C++嵌入式脚本语言 二.数据类型--table 三.协程 下面重点说一下Lua与C/C++之间的交互 [一]基本配置 [二]进行交互 [三] ...

  8. 【Lua基础】Lua入门24式

    例1 第一个程序 --经典hello程序 1 print("hello") --输出 hello 例2 注释 --单行注释使用"--"即可 --[[多行注释以& ...

  9. lua脚本之lua语言简介以及lua的安装

    本博主不擅于进行文字创作,所以,相当一部分文字皆复制于其他博文.还希望能够得到谅解.  一.Lua语言简介 Lua是一个免费的开源软件,可以免费用于科研及商业.Lua具有一个专家团队在维护和升级,其设 ...

最新文章

  1. 别让我思考(Don’t make me think)
  2. 485通讯转换器产品功能特点介绍
  3. linux c实现myecho、mycat、mycp
  4. java continue goto_Java中goto和break、continue实现区别
  5. vb读出二进制文件,合并两个文件
  6. 韩国ETRI提出实时Anchor-Free实例分割算法CenterMask,代码将开源
  7. (51)FPGA条件选择(case)
  8. Spring : Spring @Transactional-嵌套事物回滚
  9. Nginx+PHP-FPM优化技巧总结
  10. 开源库、jar包(要不要重新制造轮子)—— C/C++、Java、Python
  11. 安装webpack命令环境
  12. 对蚊子个人博客进行了彻底的改造
  13. nginx中的共享内存的3种方式
  14. 使用RabbitMQ做的一些工作及经验教训
  15. 白话空间统计三十:地统计学(1)起源
  16. co2激光切割机控制系统上位机C#源码,stm32f407控制板源码,可用于雕刻机,切割机,写字机,点胶机
  17. 考研数学——求极限方法总结
  18. 疯狂Java讲义(六)----第三部分
  19. word文档解除编辑受限(忘记密码)
  20. HTTP请求的TCP瓶颈分析

热门文章

  1. mysql修改主键属性_mysql如何改变主键属性
  2. python用方括号提取字符中的数值_python 从字符串中提取数值
  3. java 裁剪 pdf_Java PDF 切割、截取、合并工具类、转图片等
  4. 使用Pad Designer制作焊盘
  5. demo解析 小程序node.js_小程序-demo:小程序示例
  6. 离散数学 关系和有向图
  7. Micron Flash芯片识别心得
  8. 【 MATLAB 】cat 函数介绍(沿指定维度串联数组)
  9. 中消协:警惕以治病为噱头的保健品虚假宣传行为
  10. python3写unicode编码到文件