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下载地址:http://luaforge.net/projects/luainterface/(下载luainterface-1.5.3,这里面的资源比较多)

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
{
  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是主要接口

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • Lua和C++的通信流程分解

    网上关于Lua的教程似乎还没有泛滥,最近刚好学习在Cocos2d-x使用Lua,当然了,我是写教程狂,我会分享我的学习心得的~ (旁白:我噗~!每次你写东西我就要吐槽,你不累么= =)   这是第一课,先来让Lua和C++认识一下,顺便让它们逛街吃饭牵小手什么的- (旁白:...吹,继续吹) 1. Lua的堆栈和全局表 我们来简单解释一下Lua的堆栈和全局表,堆栈大家应该会比较熟悉,它主要是用来让C++和Lua通信的,是的,它们并不认识对方,只能通过堆栈来沟通,就像写信一样. (旁白:它们不会用

  • Lua调用自定义C模块

    这是<Lua程序设计>中提到的,但是想成功执行,对于初学Lua的确没那么简单.这里涉及如何如何生成一个动态链接库so文件:Lua5.2中导出函数从LuaL_register变成了LuaL_newlib.对于具体的细节有待深入.这里的模块名是hello_lib, Lua解释器会根据名字找到对应的模块,而后执行其中的 luaopen_XXX方法. 代码: #include <math.h> #include <lua5.2/lua.h> #include <lua5.

  • C++中调用Lua函数实例

    唉,今天心情有点糟糕,我就少说一些啰嗦的话了. (旁白:太好了-) 上一章传送门:http://www.jb51.net/article/55096.htm 经过前面几章的介绍,相信大家对Lua的堆栈已经比较熟悉了,如果还不是很熟悉的朋友,建议多看几遍前面的教程,或者多敲几次代码. 那么,如果已经对Lua的堆栈比较熟悉,接下来的内容就很简单了. 今天我们来看看C++如何调用Lua的函数,先看看现在Lua文件是什么样的: 复制代码 代码如下: -- helloLua.lua文件 myName =

  • Lua教程(二十):Lua调用C函数

    Lua可以调用C函数的能力将极大的提高Lua的可扩展性和可用性.对于有些和操作系统相关的功能,或者是对效率要求较高的模块,我们完全可以通过C函数来实现,之后再通过Lua调用指定的C函数.对于那些可被Lua调用的C函数而言,其接口必须遵循Lua要求的形式,即typedef int (*lua_CFunction)(lua_State* L).简单说明一下,该函数类型仅仅包含一个表示Lua环境的指针作为其唯一的参数,实现者可以通过该指针进一步获取Lua代码中实际传入的参数.返回值是整型,表示该C函数

  • Lua中调用C++函数实例

    到这为止,大家对Lua和C++之间的通信应该有些熟悉了,今天我们来介绍最后一个操作. (旁白:什么?最后一个?要结束了么?太好了~!) 上一章传送门:http://www.jb51.net/article/55097.htm 1. Lua调用C++的函数 Lua要调用C++的函数还是蛮方便的,首先,我们来创建一个c++函数先: 复制代码 代码如下: public: static int getNumber(int num); int HelloLua::getNumber( int num )

  • 简单谈谈lua和c的交互

    介绍 lua和c的亲密接触,靠的是一个虚拟栈.lua通过这个虚拟栈来实现和c之间值的互传.栈上的每一个元素是一个lua值(nil,number,string...). 当lua调用c函数的时候,这个函数会得到一个新的栈,这个栈独立于c函数本身的栈,也独立于lua自己的栈.它里面包含了lua要传给c的所有参数,然后c函数会把返回的结果放入这个栈中返回给调用者. 对于栈的查询操作,如果按照栈的规则,只能拿到栈顶的元素.但这里和常规的栈有一些差异.就是可以用一个索引来指向栈上的任何元素.正数的索引(1

  • Lua中调用C语言函数实例

    在上一篇文章(C调用lua函数)中,讲述了如何用c语言调用lua函数,通常,A语言能调用B语言,反过来也是成立的.正如Java与c语言之间使用JNI来互调,Lua与C也可以互调. 当lua调用c函数时,使用了和c调用lua中的同一种栈,c函数从栈中得到函数,然后将结果压入栈中.为了区分返回结果和栈中的其他值,每一个函数返回结果的个数. 这里有个重要的概念:这个栈不是全局的结构,每个函数都有自己的私有局部栈.哪怕c函数调用了lua代码,lua代码再次调用该c函数,他们有各自独立的局部栈.第一个参数

  • Lua和C语言的交互详解

    前言 对于Lua的基础总结总算告一段落了,从这篇博文开始,我们才真正的进入Lua的世界,一个无聊而又有趣的世界.来吧. Lua语言是一种嵌入式语言,它本身的威力有限:当Lua遇见了C,那它就展示了它的强大威力.C和Lua是可以相互调用的.第一种情况是,C语言拥有控制权,Lua是一个库,这种形式中的C代码称为"应用程序代码":第二种情况是,Lua拥有控制权,C语言是一个库,这个时候C代码就是"库代码"."应用程序代码"和"库代码"

  • Lua与C语言间的交互实例

    Lua 是一门轻巧.灵活.扩展性很强的脚本语言,它可以很容易的嵌入到其他语言(C/C++)中使用,这主要得益于其提供了功能强大的 C API,这让其跟 C/C++ 间的互调成为一件很轻松的事. Lua 调用 C Lua 调用 C 函数,其实就是把 C 函数注册到 Lua 中去,把 C 函数地址传递给 Lua 解释器.这个传递是要遵循一个的协议的,即: 复制代码 代码如下: typedef int (*lua_CFunction)(lua_State* L) Lua 和 C 是通过栈(State)

  • C#和lua相互调用的方法教程

    前言 自从ulua在官网上出来后,lua 就被u3d开发人员喜爱.国内有几个高手把lua拿过来 接着进行了封装.很多都是新手转过来.lua语法一看遍知,但是大多数人还是不明白两个语言之间的互相调用是怎么一回事,这也是难点和重点.所以今天想跟大家分享一下这方面的知识,让大家少走弯路吧. Lua是一种很好的扩展性语言,Lua解释器被设计成一个很容易嵌入到宿主程序的库.LuaInterface则用于实现Lua和CLR的混合编程. C与lua交互面临以下几个问题: 1.由于lua里面的数据都是动态加载的

  • 原生实现C#与Lua相互调用方法(Unity3D可用)

    目录 引言 一.编译Lua动态链接库 1. 编译Windows下使用的DLL文件 2. 编译Android下使用的SO文件 二.编写C#使用的API 1. 动态链接库在Unity中的存放位置. 2. 编写C#的API[LuaDll.cs] 3.需要注意的几个地方 三.C#与Lua的相互调用举例 1. C#中创建Lua环境 2. 加载Lua代码并执行,调用Lua的函数及向Lua传递参数. 3. 将C#函数提供给Lua使用,需要使用静态方法参考上面LuaFunction的定义. 4. Lua代码调用

  • ThinkPHP控制器间实现相互调用的方法

    本文实例讲述了ThinkPHP控制器间实现相互调用的方法.分享给大家供大家参考.具体实现方法如下: ThinkPHP同一个项目里,两个控制器的方法如何相互调用呢?ThinkPHP提供了一个A(),通过它可以使控制器之间的方法相互调用,使得代码可以重复利用. 官方似乎对A()方法没有相关使用文档,现在通过一个例子来说一下如使用A()方法. 有两个控制器,ColumnsAction和NewsAction.ncatlist()是ColumnsAction的分类列表方法,现在我要在控制器NewsActi

  • Java代码中与Lua相互调用实现详解

    目录 一.方案 二.性能测试 1. ScriptEngine调用方式 2. Globals调用方式 3. lua调用java 三.结论 四.其他调用方式? 一.方案 Java与Lua相互调用案例比较少,因此项目使用需要做详细的性能测试,本内容只做粗略测试. 目前已完成初版Lua-Java调用框架开发,后期有时间准备把框架进行抽象,并开源出来,感兴趣的小伙伴欢迎关注下. 目前最常见的方案:luaj,纯Java实现的Lua解析器,基于Lua 5.2 LuaJ的原理:用Java实现了一套Lua的编译器

  • js与applet相互调用的方法

    本文实例讲述了js与applet相互调用的方法.分享给大家供大家参考,具体如下: js调用java 可以在网页里使用 <script language=javascript> document.applets[0].java中的方法名 </script> 可以对applet进行控制,也可以从applet返回值. 返回值无需关心值得类型,js会隐式的转换. 传值到applet中应考虑类型匹配. java调用js 需要导入netscape.javascript.jsobject这个类

  • Android和JavaScript相互调用的方法

    本文实例讲述了Android和JavaScript相互调用的方法.分享给大家供大家参考,具体如下: Html页面和Java代码结合的方式一般用在界面经常被更改 的情况下,可以讲html放在网络中,软件一打开就会访问网络获取到最新的界面.缺点是会受到网络信号的影响,从而导致访问速度慢. 1.用WebView来显示HTML代码 2.允许WebView执行JavaScript 复制代码 代码如下: webView.getSettings().setJavaScriptEnabled(true); 3.

  • Android与JS相互调用的方法

    目录 Android调用js的方法实现是引入一个webview用webview打开一个页面调取的JS函数. 下面是JS同Android的通信,JS调用Android的函数方法. Android调用js的方法实现是引入一个webview用webview打开一个页面调取的JS函数. private void InitWebView() { mWebView = (WebView) findViewById(R.id.webview); WebSettings webSettings = mWebVi

  • PowerShell入门教程之Cmd命令与PowerShell命令相互调用的方法

    单独使用一种脚本来完成一项任务是理想的状态,而现实的情况往往是,因为历史原因.或者团队组成,你不得不将多种脚本或者程序组合在一起,来完成某项任务.本文的讨论范围是Cmd命令与PowerShell命令之间的组合与调用. 毋庸置疑,Cmd命令与PowerShell命令之间的调用有两个方向.即在Cmd命令中调用PowerShell的命令,以及在PowerShell脚本中调用Cmd命令.需要说明的是,这里的调用分两个层次:一.简单的在其中一个的环境中执行另外一个命令,完成部分工作:二.在其中一个的执行上

  • C语言与Lua之间的相互调用详解

    前言 第一次接触Lua是因为Unity游戏中需要热更,但是一直没搞懂Lua是怎么嵌入到别的语言中执行的,如何互相调用的. lua是扩展性非常良好的语言,虽然核心非常精简,但是用户可以依靠lua库来实现大部分工作.除此之外,lua还可以通过与C函数相互调用来扩展程序功能.在C中嵌入lua脚本既可以让用户在不重新编译代码的情况下修改lua代码更新程序,也可以给用户提供一个自由定制的接口,这种方法遵循了机制与策略分离的原则.在lua中调用C函数可以提高程序的运行效率.lua与C的相互调用在工程中相当实

  • Lua教程(二):C++和Lua相互传递数据示例

    这是我的Lua系列教程的第二篇,本篇文章主要介绍C++和Lua相互传递数据.如果你还不知道怎么在c/c++里面调用Lua脚本的话,请参考这篇文章. 本文主要介绍基本数据类型的传递,比如整形(int),字符串(string).数字(number)及bool值. 加载并运行Lua脚本 由于在上一个教程里面已经介绍过如何在C/C++里面嵌入Lua,所以这一节就简单的介绍一下程序怎么用,配置就略过啦. 创建Lua虚拟机 复制代码 代码如下: lua_State *lua_state = luaL_new

随机推荐