Lua与.net的CLR相互调用

工程环境搭建:

  • 下载luainterface-1.5.3.zip文件,使用到的dll为Built目录下的LuaInterface.dll、lua51.dll、luanet.dll
  • LuaInterface.dll为C#的dll,需要引用到工程中
  • lua51.dll、luanet.dll为C++的dll,需要拷贝到工程的输出目录下(Debug)
  • C#调用Lua需要使用:LuaInterface.dll和lua51.dll
  • Lua调用C#的类需要使用:LuaInterface.dll和luanet.dll,luanet.dll拷贝到工程输出目录,lua脚本中就不需要使用package.cpath和require了

很多帖子并没有讲清楚导致报错:

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

也就是云哥我这么给力

 1 namespace TestLua
 2 {
 3     public class Program
 4     {
 5
 6         public string name = "zhaozongyun";
 7         static void Main(string[] args)
 8         {
 9             //创建lua解释器(也叫Lua虚拟机)
10             Lua lua1 = new Lua();
11
12             Console.WriteLine("--->> C#中执行Lua字符串");
13
14             //C#中执行Lua字符串
15             lua1.DoString("num = 111");
16             lua1.DoString("str = ‘zhaozongyun‘");
17             Object[] values = lua1.DoString("return num, str");
18             foreach (Object obj in values)
19             {
20                 Console.WriteLine(obj);
21             }
22
23             Console.WriteLine("--->> C#注册的普通方法到Lua中,并执行Lua字符串");
24
25             //C#注册的普通方法到lua中,并执行Lua字符串
26             Program p = new Program();
27             Lua lua2 = new Lua();
28             lua2.RegisterFunction("LuaMethod1", p, p.GetType().GetMethod("CLRMethod"));
29             lua2.DoString("LuaMethod1()");
30
31             Console.WriteLine("--->> C#注册静态方法到Lua中,并执行Lua字符串");
32
33             //C#注册静态方法到Lua中,并执行Lua字符串
34             lua2.RegisterFunction("LuaMethod2", null, typeof(Program).GetMethod("StaticMethod"));
35             lua2.DoString("LuaMethod2()");
36
37             Console.WriteLine("--->> C#中执行Lua脚本");
38
39             //C#中执行lua脚本文件
40             Lua lua3 = new Lua();
41             lua3.DoFile("myLua1.lua");
42
43             Console.WriteLine("--->>C#执行Lua脚本,Lua脚本中加载C#类,并访问C#");
44
45             //C#执行Lua文件,Lua文件加载C#类,并调用C#
46             Lua lua4 = new Lua();
47             lua4.DoFile("myLua2.lua");
48             lua4.DoFile("myLua3.lua");
49
50             Console.ReadKey();
51         }
52
53         public void CLRMethod()
54         {
55             Console.WriteLine("CLRMethod");
56         }
57
58         public static void StaticMethod()
59         {
60             Console.WriteLine("StaticMethod");
61         }
62     }
63 }

Lua1脚本

1 num = 222
2 string = "hello world"
3 print(string)

Lua2脚本

1 --加载CLR的类型、实例化CLR对象
2 luanet.load_assembly("System")
3 Int32 = luanet.import_type("System.Int32")
4 print(Int32)

Lua3脚本

1 --require "luanet"
2 --加载CLR的类型
3 luanet.load_assembly("TestLua")
4 Program = luanet.import_type("TestLua.Program")
5 --实例化CLR对象
6 program = Program()
7 print(program.name)
8 program:CLRMethod()
时间: 2024-10-11 06:13:29

Lua与.net的CLR相互调用的相关文章

C#与lua相互调用

Lua是一种很好的扩展性语言,Lua解释器被设计成一个很容易嵌入到宿主程序的库.LuaInterface则用于实现Lua和CLR的混合编程. (一)C#调用Lua 测试环境:在VS2015中建一个C#控制台应用程序,并添加LuaInterface.dll的引用 LuaInterface下载地址:http://luaforge.net/projects/luainterface/ (下载luainterface-1.5.3,这里面的资源比较多) LuaInterface.Lua类是CLR访问Lua

C程序与Lua脚本相互调用

Lua脚本是一种可用于C程序开发/测试的工具,本篇介绍一下C程序与Lua脚本如何进行相互调用,更加详细的操作参见<Programing in Lua>.本文分为3个部分:1.Windows环境下Lua的下载以及安装注意事项:2.Visual C++6.0中Lua的配置:3.C程序与Lua脚本相互调用实例. 1.Windows环境下Lua的下载以及安装注意事项 a.下载Lua for Windows,笔者用的版本是V5.1.4-35: b.上微软官网,下载Visual C++运行库——vcred

lua编程之lua与C相互调用

lua是扩展性非常良好的语言,虽然核心非常精简,但是用户可以依靠lua库来实现大部分工作.除此之外,lua还可以通过与C函数相互调用来扩展程序功能.在C中嵌入lua脚本既可以让用户在不重新编译代码的情况下修改lua代码更新程序,也可以给用户提供一个自由定制的接口,这种方法遵循了机制与策略分离的原则.在lua中调用C函数可以提高程序的运行效率.lua与C的相互调用在工程中相当实用,本文就来讲解lua与C相互调用的方法. Lua与C相互调用的首要问题是如何交换数据,lua API使用了一个抽象的栈与

lua和C++相互调用

从lua调用C++函数和对象,利用LuaPlus可以方便的从C++中调用lua脚本,反过也一样.通过注册函数或类对象,lua便可以访问C++. 一.C风格函数注册    Lua提供了C风格的回调函数注册,该函数原型如下: int Callback(LuaState* state); 无论是全局函数.类非虚函数.类虚函数,只要符合上面的原型,都可以向Lua注册.我们以全局函数为例,下面是我们提供的一个回调函数CStyleAddFunc: int CStyleAddFunc(LuaState * s

Cocos2d-x3.0下 Lua与C++相互调用

这里讲下Lua与C++之间如何实现相互调用 原文连接:http://blog.csdn.net/qqmcy/article/details/26052771 DJLCData.h 实现类 // // DJLCData.h // uitestLua // // Created by 杜甲 on 14-5-17. // // #ifndef __uitestLua__DJLCData__ #define __uitestLua__DJLCData__ #include "cocos2d.h"

菜鸟入门之lua与c++相互调用(包含多个demo)

前两篇文章中,已经介绍了使用vs2010编译lua5.1源码生成lua.lib 和 vs项目中使用c++调用lua,可以保证demo在vs上运行起来了.这里再详细介绍下c++和lua之间的相互调用以及原理. c++与lua直接的调用,实际上通过一个栈结构来传递数据,该栈结构栈顶的索引值为-1,向栈底方向索引值依次为-1 ,-2......栈顶索引为1.栈结构里可以放函数,表,字符串,整形等各种lua的基本数据. 一.在当前cpp目录下创建test.lua文件,用于与c++交互调用,代码如下: p

Lua与C++相互调用

{--1.环境--} 为了快速入手,使用了小巧快速的vc++6.0编译器 以及在官网下载了Lua安装包..官网地址{--http://10.21.210.18/seeyon/index.jsp--} 两者都安装好后,即可进行 {--2.工程以及配置--} 1.首先用vc++6.0创建一个简单的win32 console application 2.从Lua的安装目录下复制include和lib两个目录下的文件到刚刚创建的工程的目录下. {include:包含了lua的.h头文件} {lib:包含

Lua与C的相互调用

闲的蛋疼,让C和Lua玩包剪锤.结果C以微弱的优势胜出了. 言归正传,这次主要是想练习Lua和C的相互调用. 一.C调用Lua函数 1. luaL_dofile(L, fn); 该函数可以让Lua虚拟栈读取路径为fn的Lua文件,其实质是: lua_loadfile(L, fn) || lua_pcall(L, 0, Lua_MUTIRET, 0) 实际上,lua_loadfile只是把Lua文件加载到VM,成为一个可执行的对象,但却还没有执行它,所以还不能使用. 而lua_pcall则把该Lu

uLua学习笔记(三):Unity3D和Lua之间的相互调用

这篇笔记主要集中学习一下uLua和Unity3D之间相互调用的方法,我们导入了uLua之后,现在会弹出一个类似学习屏幕的东西,如下: 先赞一个! Unity3D调用Lua Unity3D调用Lua的方法还是比较简单的,所以先说这个,由于这部分在学习笔记(一)中已经说的挺多的了,更多的内容点击这里回去看,所以这里我们就来看一个简单的示例即可: 1 using LuaInterface; 2 using UnityEngine; 3 4 public class UnityCallLua : Mon