为了搞懂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游戏引擎中,开发人员经常使用C#作为主要编程语言,但由于其脚本语言...为了充分利用这个工具,开发者需要了解XLUA的用法,包括如何配置项目、怎样封装C#对象、如何处理LUA和C#间的交互,以及如何调试LUA代码。
版本5.3.5表明该库基于Lua 5.3.5版本进行封装。 使用CLua.net,你可以将Lua作为一种轻量级的嵌入式脚本语言用于游戏开发、配置管理、逻辑处理等多种场景。通过这个库,你可以利用Lua的强大脚本能力来编写动态行为,...
在IT行业中,C#与Lua的结合应用是一个有趣且实用的话题。C#是Microsoft开发的一种面向对象的编程语言,广泛用于Windows平台上的应用程序、游戏开发和Web服务。而Lua则是一种轻量级的脚本语言,以其简洁的语法、易读...
在本文中,我们将深入探讨如何使用Visual Studio 2019编译Lua 5.4.4源码,创建一个C++库,并演示如何在C++项目中正确地加载和调用Lua脚本。Lua是一种轻量级的脚本语言,广泛应用于游戏开发、系统配置、软件扩展等多...
接下来,LuaInterface.dll是一个C#与LUA交互的接口库,它提供了一种更高级别的封装,使得C#开发者可以更方便地调用LUA代码。LuaInterface提供了ILuaState接口,该接口提供了加载、执行和管理LUA脚本的方法。例如,你...
XLua是一个高效、强大的Lua脚本绑定工具,它使得开发者可以在Unity项目中利用Lua语言的强大功能,同时保持与C#代码的无缝集成。在本案例中,我们讨论的是"unity xlua lua5.4.4最新版lua库文件",这意味着你已经获取...
在IT行业中,尤其是在游戏开发和自动化领域,常常需要在C#这样的强类型语言中嵌入动态脚本语言,如Lua。MoonSharp是一个优秀的开源库,它允许C#开发者轻松地集成Lua脚本,并且在Unity3D环境中表现良好。本文将深入...
Lua资源框架则在此基础上,进一步封装了资源加载和管理,提高了开发效率。 在"Lua资源框架.zip"中,我们可以期待找到以下组件: 1. **Lua脚本库**:包含了一系列预定义的Lua函数和工具,用于资源的加载、卸载、...
`xlua`是一个将C#的Excel操作封装为Lua调用的库,而`luaxlsx`则是纯Lua编写的,能够直接读写.xlsx文件。 1. **xlua**: 使用xlua时,你需要先在C#环境中创建Excel操作的接口,然后通过tolua++编译成动态链接库供Lua...
4. **LuaObjectWrapper**: 用于在Lua中封装C#对象,使得Lua代码可以调用C#的方法和访问属性。 了解这些基本概念后,我们可以进行更深入的实践。例如,你可以编写C#代码注册一个函数到Lua,然后在Lua脚本中调用这个...
对于C#项目,还需要相应的托管封装(如XLua)来处理互操作性。 总之,"lua5.3.4 vs动态库工程"是一个面向Windows开发者的资源,它包含了编译Lua动态库所需的所有文件和配置,配合XLua,可以高效地在C#项目中集成和...
2. **事件系统集成**:Lua框架会封装UGUI的事件系统,让Lua可以直接监听和处理UI控件的各种事件,如点击、滑动等。 3. **ECS(Entity Component System)支持**:ECS是一种面向数据的设计模式,常用于游戏开发以...
本压缩包中包含了多种编程语言实现的麻将胡牌算法,包括C++、C#、Lua、Go以及JavaScript。虽然标签中提到了“Java”,但在这个上下文中,我们主要关注的是其他五种编程语言的实现。 麻将胡牌算法的核心是判断一副...
除了基本的数据操作,StackExchange.Redis还支持发布/订阅(Pub/Sub)模式,事务(Transactions),以及脚本执行(Lua scripts)等高级功能。例如,你可以创建一个发布者和订阅者来实现消息传递: ```csharp // 创建...
在.NET环境中,通过如NLua或KeraLua等库,可以方便地将Lua与C#或其他.NET语言结合,使得游戏逻辑或动态内容可以通过Lua脚本来编写,而底层系统则由.NET来提供稳定支持。 热更新机制通常包括以下关键组成部分: 1. ...
其次,`LuaInterface.dll` 很可能是一个封装了 Lua C API 的 .NET 类库,它的作用是为 C# 开发者提供一个友好且方便的接口来操作 Lua。通过这个接口,开发者无需直接处理底层的 DLL 调用,而是可以使用 .NET 风格的...
通过这种方式,你可以在Lua脚本中实现对可执行文件的启动和关闭,尽管这通常比直接在C++或C#等更底层的语言中操作更为复杂。在实际项目中,确保正确处理错误和资源管理至关重要,以避免内存泄漏或其他潜在问题。
通过BabeLua提供的API,lua脚本可以直接调用C#的类和方法,实现底层功能的封装和跨语言调用。这使得lua脚本可以利用C#的高性能计算能力,同时保持lua的简洁性和易读性。反过来,C#也可以调用lua脚本,利用其灵活性...
这个项目是一个示例,展示了如何将Lua源码编译为适用于UWP的版本,并封装成WinRT库,以便在UWP应用程序中无缝调用。 首先,我们要理解什么是Lua。Lua是一种轻量级的、解释型的脚本语言,设计目标是提供快速、可扩展...
4. **tolua++封装**:tolua++是XLua的一部分,用于编译C#类到Lua,使得Lua可以直接调用C#的方法和访问字段。开发者需要在C#类上添加特殊的属性和方法标记,以便tolua++能够正确识别并生成对应的Lua接口。 5. **错误...