`
rcfalcon
  • 浏览: 228710 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

封装Lua for C#

    博客分类:
  • .NET
阅读更多

为了搞懂LUA在我们的GDEX中到底怎么用,我决定研究一下如何比较好的在WPF里封装一个基于lua的APP  framework。

 

今天先对Lua for C#进行了一次简单的封装。

在C#下用过Lua的人都知道,用C#实现一个函数之后和LUA绑定,需要用到Lua类的RegisterFunction方法。

 

在函数很少的情况下很好用,但是若需要绑定C#里成百上千个函数,则麻烦了,添加一个函数,至少每次需要修改两个地方:函数实现,函数绑定(RegisterFunction)。并且如果在lua中绑定的名字和C#中不一样,则更麻烦,还需要维护一个函数映射。

 

今天翻了一下google,翻出GameDev.net上一篇老外的文章,叫《Using Lua with C#》,看了一下,它的方法不错。(改天考虑翻译这篇文章),不过他的示例代码实在是太太太冗长了,大部分是生成函数介绍和函数帮助文档等,直接忽略。把它最核心的东西拿过来,然后自己封装了一下,用起来感觉不错。

 

基本思想是,使用C#的Attribute来标记函数,实现自动绑定。

 

核心部分代码如下(LuaFramework.cs):

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Reflection;
using LuaInterface;

namespace WPFLuaFramework
{
    /// <summary>
    /// Lua函数描述特性类
    /// </summary>
    public class LuaFunction : Attribute
    {
        private String FunctionName;

        public LuaFunction(String strFuncName)
        {
            FunctionName = strFuncName;
        }

        public String getFuncName()
        {
            return FunctionName;
        }
    }

    /// <summary>
    /// Lua引擎
    /// </summary>
    class LuaFramework
    {
        private Lua pLuaVM = new Lua();//lua虚拟机

        /// <summary>
        /// 注册lua函数
        /// </summary>
        /// <param name="pLuaAPIClass">lua函数类</param>
        public void BindLuaApiClass( Object pLuaAPIClass )
        {
            foreach (MethodInfo mInfo in pLuaAPIClass.GetType().GetMethods())
            {
                foreach (Attribute attr in Attribute.GetCustomAttributes(mInfo))
                {
                    string LuaFunctionName = (attr as LuaFunction).getFuncName();
                    pLuaVM.RegisterFunction(LuaFunctionName, pLuaAPIClass, mInfo);
                }
            }
        }

        /// <summary>
        /// 执行lua脚本文件
        /// </summary>
        /// <param name="luaFileName">脚本文件名</param>
        public void ExecuteFile(string luaFileName)
        {
            try
            {
                pLuaVM.DoFile(luaFileName);
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
            }
        }

        /// <summary>
        /// 执行lua脚本
        /// </summary>
        /// <param name="luaCommand">lua指令</param>
        public void ExecuteString(string luaCommand)
        {
            try
            {
                pLuaVM.DoString(luaCommand);
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
            }
        }
    }
}

 

 

我的LUA API类如下,用于实现C# for lua的函数(LuaAPI.cs)

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;

namespace WPFLuaFramework
{
    class LuaAPI
    {
        [LuaFunction("lua1")]
        public void a1()
        {
            MessageBox.Show("a1 called");
        }

        [LuaFunction("lua2")]
        public int a2()
        {
            MessageBox.Show("a2 called");
            return 0;
        }

        [LuaFunction("lua3")]
        public void a3(string s)
        {
            MessageBox.Show("a3 called");
        }
    }
}

 

 

最后看调用代码,是不是很简单

 

LuaFramework test = new LuaFramework();
test.BindLuaApiClass(new LuaAPI());
test.ExecuteFile("test.lua");
test.ExecuteString("lua1()");

 

 

LUA代码如下

 

lua1();
lua2();
lua3("test");

 

 

分享到:
评论

相关推荐

    作用于Unity开发LUA编写代码提示

    在Unity游戏引擎中,开发人员经常使用C#作为主要编程语言,但由于其脚本语言...为了充分利用这个工具,开发者需要了解XLUA的用法,包括如何配置项目、怎样封装C#对象、如何处理LUA和C#间的交互,以及如何调试LUA代码。

    CLua.net 5.3.5 c#调用 lua

    版本5.3.5表明该库基于Lua 5.3.5版本进行封装。 使用CLua.net,你可以将Lua作为一种轻量级的嵌入式脚本语言用于游戏开发、配置管理、逻辑处理等多种场景。通过这个库,你可以利用Lua的强大脚本能力来编写动态行为,...

    C#与Lua的结合实例

    在IT行业中,C#与Lua的结合应用是一个有趣且实用的话题。C#是Microsoft开发的一种面向对象的编程语言,广泛用于Windows平台上的应用程序、游戏开发和Web服务。而Lua则是一种轻量级的脚本语言,以其简洁的语法、易读...

    lua5.4.4官网源码编译C++库

    在本文中,我们将深入探讨如何使用Visual Studio 2019编译Lua 5.4.4源码,创建一个C++库,并演示如何在C++项目中正确地加载和调用Lua脚本。Lua是一种轻量级的脚本语言,广泛应用于游戏开发、系统配置、软件扩展等多...

    C#LUA DLL库

    接下来,LuaInterface.dll是一个C#与LUA交互的接口库,它提供了一种更高级别的封装,使得C#开发者可以更方便地调用LUA代码。LuaInterface提供了ILuaState接口,该接口提供了加载、执行和管理LUA脚本的方法。例如,你...

    unity xlua lua5.4.4最新版lua库文件

    XLua是一个高效、强大的Lua脚本绑定工具,它使得开发者可以在Unity项目中利用Lua语言的强大功能,同时保持与C#代码的无缝集成。在本案例中,我们讨论的是"unity xlua lua5.4.4最新版lua库文件",这意味着你已经获取...

    C# 调用moonsharp实现lua脚本嵌入的样例代码

    在IT行业中,尤其是在游戏开发和自动化领域,常常需要在C#这样的强类型语言中嵌入动态脚本语言,如Lua。MoonSharp是一个优秀的开源库,它允许C#开发者轻松地集成Lua脚本,并且在Unity3D环境中表现良好。本文将深入...

    LUA5.4动态链接库,支持中文函数,适用于Nlua

    在本案例中,这个LUA5.4动态链接库特别针对Nlua进行了优化,Nlua是.NET框架下的一个LUA绑定库,使得C#或其他.NET语言能够无缝地与LUA交互。 支持中文函数是LUA5.4的一个显著特点。在早期版本的LUA中,函数名只能由...

    Lua资源框架.zip

    Lua资源框架则在此基础上,进一步封装了资源加载和管理,提高了开发效率。 在"Lua资源框架.zip"中,我们可以期待找到以下组件: 1. **Lua脚本库**:包含了一系列预定义的Lua函数和工具,用于资源的加载、卸载、...

    lua 操作excel 表格

    `xlua`是一个将C#的Excel操作封装为Lua调用的库,而`luaxlsx`则是纯Lua编写的,能够直接读写.xlsx文件。 1. **xlua**: 使用xlua时,你需要先在C#环境中创建Excel操作的接口,然后通过tolua++编译成动态链接库供Lua...

    luainterface-1.5.3源码.rar

    4. **LuaObjectWrapper**: 用于在Lua中封装C#对象,使得Lua代码可以调用C#的方法和访问属性。 了解这些基本概念后,我们可以进行更深入的实践。例如,你可以编写C#代码注册一个函数到Lua,然后在Lua脚本中调用这个...

    lua5.3.4 vs动态库工程

    对于C#项目,还需要相应的托管封装(如XLua)来处理互操作性。 总之,"lua5.3.4 vs动态库工程"是一个面向Windows开发者的资源,它包含了编译Lua动态库所需的所有文件和配置,配合XLua,可以高效地在C#项目中集成和...

    UGUI的lua框架

    2. **事件系统集成**:Lua框架会封装UGUI的事件系统,让Lua可以直接监听和处理UI控件的各种事件,如点击、滑动等。 3. **ECS(Entity Component System)支持**:ECS是一种面向数据的设计模式,常用于游戏开发以...

    各种语言的麻将胡牌算法。干货。 c++ c# lua go js麻将胡牌算法.zip

    本压缩包中包含了多种编程语言实现的麻将胡牌算法,包括C++、C#、Lua、Go以及JavaScript。虽然标签中提到了“Java”,但在这个上下文中,我们主要关注的是其他五种编程语言的实现。 麻将胡牌算法的核心是判断一副...

    windows下c#操作redis类

    除了基本的数据操作,StackExchange.Redis还支持发布/订阅(Pub/Sub)模式,事务(Transactions),以及脚本执行(Lua scripts)等高级功能。例如,你可以创建一个发布者和订阅者来实现消息传递: ```csharp // 创建...

    Lua热更新学习工具,最好的

    在.NET环境中,通过如NLua或KeraLua等库,可以方便地将Lua与C#或其他.NET语言结合,使得游戏逻辑或动态内容可以通过Lua脚本来编写,而底层系统则由.NET来提供稳定支持。 热更新机制通常包括以下关键组成部分: 1. ...

    luainterface.rar

    其次,`LuaInterface.dll` 很可能是一个封装了 Lua C API 的 .NET 类库,它的作用是为 C# 开发者提供一个友好且方便的接口来操作 Lua。通过这个接口,开发者无需直接处理底层的 DLL 调用,而是可以使用 .NET 风格的...

    lua调用可执行文件

    通过这种方式,你可以在Lua脚本中实现对可执行文件的启动和关闭,尽管这通常比直接在C++或C#等更底层的语言中操作更为复杂。在实际项目中,确保正确处理错误和资源管理至关重要,以避免内存泄漏或其他潜在问题。

    BabeLua For 2017 V3.2.2.0.zip

    通过BabeLua提供的API,lua脚本可以直接调用C#的类和方法,实现底层功能的封装和跨语言调用。这使得lua脚本可以利用C#的高性能计算能力,同时保持lua的简洁性和易读性。反过来,C#也可以调用lua脚本,利用其灵活性...

    UWP_Lua_Demo:uwp使用lua的示例,包含lua源码编译,WinRT库封装

    这个项目是一个示例,展示了如何将Lua源码编译为适用于UWP的版本,并封装成WinRT库,以便在UWP应用程序中无缝调用。 首先,我们要理解什么是Lua。Lua是一种轻量级的、解释型的脚本语言,设计目标是提供快速、可扩展...

Global site tag (gtag.js) - Google Analytics