NLua

2025-12-07 0 839
你好呀!

感谢您检查该项目

我们已经制作了项目开源和麻省理工学院许可证,以便每个人都可以享受它。

要提供一个质量的项目,我们必须花费大量时间来研究它。

如果您喜欢该项目,请出演它。

我们还应支持任何赞助商[Patreon |贝宝]

NLua

LUA世界与.NET之间的桥梁(与.NET/UWP/MAC/Linux/Android/ios/TVOS兼容)

建筑

msbuild NLua .sln

NLua允许在UWP,Windows,Linux,Mac,iOS,Android上使用LUA。

NLua是Luainterface(来自FábioMascarenhas/Craig Presti)的叉子项目。

示例:您可以使用/实例化任何.NET类,而无需任何以前的注册或注释。

public class SomeClass{public string MyProperty { get ; private set ; }public SomeClass ( string param1 = \"defaulValue\" ){MyProperty = param1 ;}public int Func1 ( ){return 32 ;}public string AnotherFunc ( int val1 , string val2 ){return \"Some String\" ;}public static string StaticMethod ( int param ){return \"Return of Static Method\" ;}}
  • 使用UTF-8编码:

NLua运行在喀拉鲁亚绑定的顶部,默认情况下使用ASCII编码来编码字符串。如果要使用UTF-8编码,只需将lua.state.coding属性设置为Encoding.utf8:

 using ( Lua lua = new Lua ( ) ){lua . State . Encoding = Encoding . UTF8 ;lua . DoString ( \"res = \'Файл\'\" ) ;string res = ( string ) lua [ \"res\" ] ;Assert . AreEqual ( \"Файл\" , res ) ;}

创建LUA状态:

using NLua ;Lua state = new Lua ( )

评估简单表达式:

var res = state . DoString ( \"return 10 + 3*(5 + 2)\" ) [ 0 ] as double ;// Lua can return multiple values, for this reason DoString return a array of objects

将原始价值传递给状态:

double val = 12.0 ;state [ \"x\" ] = val ; // Create a global value \'x\' var res = ( double ) state . DoString ( \"return 10 + x*(5 + 2)\" ) [ 0 ] ;

检索全球价值:

state . DoString ( \"y = 10 + x*(5 + 2)\" ) ;double y = ( double ) state [ \"y\" ] ; // Retrieve the value of y

检索LUA功能:

state . DoString ( @\"	function ScriptFunc (val1, val2)		if val1 > val2 then			return val1 + 1		else			return val2 - 1		end	end	\" ) ;var scriptFunc = state [ \"ScriptFunc\" ] as LuaFunction ;var res = ( int ) scriptFunc . Call ( 3 , 5 ) . First ( ) ;// LuaFunction.Call will also return a array of objects, since a Lua function// can return multiple values

##使用.net对象。##

将.NET对象传递到状态:

SomeClass obj = new SomeClass ( \"Param\" ) ;state [ \"obj\" ] = obj ; // Create a global value \'obj\' of .NET type SomeClass // This could be any .NET object, from BCL or from your assemblies

使用LUA内的.NET组件:

要访问任何.NET组件以创建LUA内部的对象,事件等,您需要要求NLua将CLR用作LUA软件包。为此,只需使用方法LoadClrPackage,然后使用LUA脚本中的导入函数来加载程序集即可。

state . LoadCLRPackage ( ) ;state . DoString ( @\" import (\'MyAssembly\', \'MyNamespace\') 			   import (\'System.Web\') \" ) ;// import will load any .NET assembly and they will be available inside the Lua context.

创建.NET对象:要创建对象,您只需要与()使用类名。

 state . DoString ( @\"	 obj2 = SomeClass() -- you can suppress default values.	 client = WebClient()	\" ) ;

呼叫实例方法:要呼叫实例方法,您需要使用:符号,可以从传递给LUA的对象或在LUA上下文中创建的对象调用方法。

state . DoString ( @\"	local res1 = obj:Func1()	local res2 = obj2:AnotherFunc (10, \'hello\')	local res3 = client:DownloadString(\'http://NLua.***org\')	\" ) ;

调用静态方法:您只能使用类名和the调用静态方法。卢阿的符号。

state . DoString ( @\"	local res4 = SomeClass.StaticMethod(4)	\" ) ;

调用属性:您可以使用(或设置)使用任何属性。卢阿的符号。

state . DoString ( @\"	local res5 = obj.MyProperty	\" ) ;

所有方法,事件或属性都需要公开, NLua将无法致电非公共成员。

如果您使用的是Xamarin.ios,则需要保留要在NLua内使用的类,否则,如果不使用该类,链接器将从最终二进制中删除类。

##沙盒##

在您的应用程序中,有很多方法可以在您的应用程序中进行沙盒脚本。我强烈建议您使用普通的Lua进行沙箱。您可以在加载用户脚本之前重新编写导入功能,如果用户尝试导入.NET组件,则不会发生任何事情。

state . DoString ( @\"		import = function () end	\" ) ;

lua-sandbox用户列表

团结整合

  1. 为.NET 2.0构建或从Nuget下载Keralua和NLua (使用下载软件包链接)

  2. 如果下载:将文件扩展名从.nupkg更改为.zip

  3. 在您的Unity Project的资产目录插件/ keralua和插件/ NLua中创建文件夹

  4. 将这些ZIP文件的NetStandard2.0内容提取到新创建的Unity文件夹中。您的树看起来应该大致像这样(用喀拉鲁人的运行时间定制为您的构建目标)

Plugins
├── KeraLua
│   ├── LICENSE
│   ├── LICENSE.meta
│   ├── lib
│   │   ├── netstandard2.0
│   │   │   ├── KeraLua.dll
│   │   │   ├── KeraLua.dll.meta
│   │   │   ├── KeraLua.xml
│   │   │   └── KeraLua.xml.meta
│   │   └── netstandard2.0.meta
│   ├── lib.meta
│   ├── runtimes
│   │   ├── linux-x64
│   │   │   ├── native
│   │   │   │   ├── liblua54.so
│   │   │   │   └── liblua54.so.meta
│   │   │   └── native.meta
│   │   ├── linux-x64.meta
│   │   ├── osx
│   │   │   ├── native
│   │   │   │   ├── liblua54.dylib
│   │   │   │   └── liblua54.dylib.meta
│   │   │   └── native.meta
│   │   ├── osx.meta
│   │   ├── win-x64
│   │   │   ├── native
│   │   │   │   ├── lua54.dll
│   │   │   │   └── lua54.dll.meta
│   │   │   └── native.meta
│   │   ├── win-x64.meta
│   │   ├── win-x86
│   │   │   ├── native
│   │   │   │   ├── lua54.dll
│   │   │   │   └── lua54.dll.meta
│   │   │   └── native.meta
│   │   └── win-x86.meta
│   └── runtimes.meta
├── KeraLua.meta
├── NLua
│   ├── LICENSE
│   ├── LICENSE.meta
│   ├── lib
│   │   ├── netstandard2.0
│   │   │   ├── NLua .dll
│   │   │   └── NLua .dll.meta
│   │   └── netstandard2.0.meta
│   └── lib.meta
└── NLua .meta
  1. 浏览Unity Inspector中的每个Keralua Runtime Liblua54文件,并根据文件夹为编辑器和独立设置正确的平台设置。不要忘记申请

统一笔记

  • 您可能需要要附加到包装。Path您可以使用lua.dostring之类的操作(“ package.path = package.path .. ” + application.persistentDatapath +“ /?/?..lua;” + application.persistentdatapath +“/?

  • 您将需要将debug.log暴露于lua(并覆盖打印功能以查看LUA日志)

  • 数字将以双重类型返回

  • LUA实例上设置的字段可能为null,您需要处理它

版权(C)2025 Vinicius Jarina(viniciusjarina@gmail.com)

NLua 1.4.x

几年后, NLua进行了大量清理和重构。

  • 移至.NET C#样式。

  • 将喀拉鲁亚作为nuget依赖。

  • 对Kopilua/Silverlight/Windows Phone的支持下降

NLua 1.3.2

  • 迁移到统一的Xamarin.ios(ios)

  • 添加了__call方法,将LUA的操作/弹性称为LUA功能。

  • 固定#116访问基类方法的问题

  • 修复了#117班级和基础类别的相同方法的问题

  • 修复了带有参数关键字的#125调用方法。

NLua 1.3.2

  • 添加了Winrt的支持(Windows Phone 8)

  • 添加了对Unity3D的支持

  • 更新LUA 5.2.3使用最新补丁

  • 固定支持Unicode字符串(UTF-8)

  • 修复了x86/x64问题。

  • 固定过载问题

  • 固定支持Debug和Debughook Apis

  • 为操作员添加了支持

  • 固定对密钥的访问。

  • 修复了ValueTypes的问题

NLua 1.3.0

  • 将LUA更新为5.2.3

  • 更新到Xamarin组件商店。 (http://components.x*am*ar*in.com/view/nlua

NLua 1.2.0

  • Nuget软件包(https://www.*nu*ge*t.org/packages/nlua/)

  • 端口到Android 15+(Armeabi,V7A,X86)

  • 更新的LUA 5.2.2(补丁7)

  • 很多错误修复。

NLua 1.1.0

  • WP7的端口(感谢Mangatome)

  • NLua现在使用LUA 5.2.2

  • 错误修复。

NLua 1.0.0

  • 从Luainterface分叉2.0.4

  • 使用Keralua添加了iOS支持(C#P/Invoke Lua)

###帮助NLua ###

  • 贡献


  • NLua使用单声道风格http://www.mo*no-p*roje*ct.com/coding_guidelines。

  • 请,不要更改线端或重新指示代码。

  • 推送之前,请运行测试。

  • 避免推动样式更改(除非确实需要),重命名和移动代码。

旧历史

Luainterface

版权(C)2003-2006 Fabio Mascarenhas de Queiroz

维护者:craig presti,craig@vastpark.com

lua51.dll和lua51.exe是版权(C)2005 Tecgraf,Puc-rio

NLua入门:

  • 查看src /test NLua /testlua,以查看C#使用的示例(可选的是,您可以使用debugger从NLua解决方案内运行此示例)。
    还提供了一个很好的示例,说明了如何覆盖LUA的NET方法和在.NET应用程序中使用NLua 。

  • 查看samples/testluaform.lua以查看如何在lua内使用.net的示例

  • 在doc/guide.pdf文件中进行更多安装和使用说明。

Luainterface 2.0.3中的新功能

  • 修复:可通过Luainterface访问的私人方法

  • 修复:方法超载查找失败

  • 修复:找不到文件时Lua Dofile内存泄漏(Paul Moore提交)

  • 修复:Lua处置不释放记忆(Paul Moore提交)

  • 修复:更好地支持访问索引器

  • 修复:MBCS字符的解析错误(Qingrui.li)

  • 修复:处理源自Luatable,Luafunction,Luauserdata的错误

  • 修复:Luainterface通过超载构造函数通过一个状态时不再处置状态

  • 添加:LoadString和LoadFile(Paul Moore提交)

  • 添加:超载的串线

  • 添加:LUA调试支持(Rostermeier)

Luainterface 2.0.1中的新功能

  • 显然,2.0构建的二进制文件对某些用户有问题,这只是一个重建的LUA资源,将其拉入Luainterface.zip。

Luainterface 2.0中的新功能

  • 现在,lua5.1.2库以完全管理的代码构建。 Luainterface现在是纯CIL

  • 不再需要各种连接旧X86版本的适配器

  • 托比·劳伦斯(Toby Lawrence),奥利弗·尼莫斯(Oliver Nemoz)和克雷格·普雷斯蒂(Craig Presti)的绩效修复

Luainterface 1.5.3中的新功能

  • 内部Lua Panics(由于API违规)现在将Luaexceptions置于.NET中

  • 如果.NET代码将异常归入LUA,LUA不处理它,则原始异常将转发回.NET土地。

  • 修复LUA 5.1.1 GMATCH C代码中的错误 – 假设Gmatch仅与表配合使用,则不当。

Luainterface 1.5.2中的新功能

  • LUA的覆盖C#方法是固定的(用.NET 2.0打破!)

  • 固定了LUA的静态C#函数(用LUA-5.1.1打破)

  • 重建以解决1.5.1中包含的二进制文件的链接问题

  • 寄存器函数一直将东西泄漏到堆栈上

Luainterface 1.5.1中的新功能

修复了一个严重的Bug WRT垃圾收集 – 新的LUA5.1开关特别明显:如果您对时机非常不幸,有时LUA会放松对CLR功能的指针。

当我添加对静态方法的支持时,我允许用户使用结肠或点将方法与类名称分开。这是不正确的 – 它打破了超载静态方法之间的歧义。
因此,Luainterface现在更加严格:如果要调用静态方法,则必须使用DOT将方法名称与类名称分开。当然,如果使用实例,您仍然可以使用结肠。

现在,静态方法调用速度更快(由于缓存更好)。

Luainterface 1.5中的新功能

Luainterface现在已更新为基于LUA5.1.1。您可以将自己的构建/二进制文件用于LUA5.1.1,也可以使用此处分布的版本。 (非常感谢Steffen Itterheim的这项工作!)

luainterface.lua不再具有OpenLibs等… LUA库加载的基本机制已更改,我们还没有将Luainterface的库加载分开。相反,所有标准的LUA库将在启动时自动加载。

修复了一个错误,其中某些静态方法的调用将引用无效的指针。

修复了带有嵌入式空字符的字符串在LUA中传递或以外的错误(感谢Daniel N.Ri的报告和修复!)

Luainterface中的本机组件(即Lua51和Loader)都是作为发行版构建的 – 以防止加载标准Windows库的问题。

注意:除非要修改lua internals,否则您不需要下载/构建lua-5.1.1。

Luainterface 1.4中的新功能

注意:Fabio感兴趣的地区已朝其他方向移开(希望仅暂时)。我已经与法比奥(Fabio)进行了交谈,他说他对我进行了新的发行版,并在过去几个月中进行了各种修复。自1.3以来的更改:

支持Visual Studio 2005/.NET 2.0。

Compat-5.1被修改为期望后斜线作为路径分离器。

Luainterface现在可以与通用C#类正确使用。

现在支持CLR内部类型。

修复了有时LUA代理对象与错误的CLR对象关联的问题。

如果CLR类具有数组登录器,则可以使用常规LUA索引接口访问元素。

将clrpackage.lua添加到样本目录。此类使自动加载引用的组件变得容易得多。在下一个版本中,此加载将是自动的。

要查看luainterface的快速演示,请将CD cd到NLua /样本中,然后输入:….  build  debug  luarunner.exe testluaform.lua

我忘记的其他各种次要修复程序。下次我会保持更好的跟踪。

注意:Luainterface仍然基于LUA 5.0.2。如果有人真的希望我们升级到LUA 5.1,请给我发便笺。同时,我还使用适当的VS 2005项目文件分发了LUA 5.0.2的版本。除非您要修改LUA内部设备(lua50.dll的构建版本都包含在常规的luainterface发行版中),否则您无需下载此文件(lua50.dll)

Luainterface 1.3中的新功能

Luainterface现在与LuaBinies版本2(http://luabinaries.luaforg**e.net)*和Compat-5.1版本3(http://luaforge.net/projects/compat)一起使用。 Loader DLL现在称为luanet.dll,不再需要NLua .lua文件(只需将luainterface.dll放在gac中,luanet.dll,在您的软件包中,并且确实需要“ luanet”)。

修复了炭类型治疗中的错误(感谢罗恩·斯科特(Ron Scott))。

luainterface.dll现在有一个很强的名称,并且可以放入GAC(感谢Ivan Voras)。

现在,您可以使用Luatable的实例(感谢Zachary Landau)。

加载组件和导入类型有另一种形式(基于Lua Wiki中的匿名贡献)。检查样本文件夹中的_ alt文件。

Luainterface 1.2.1中的新功能

现在检查两个luainterface.lua实例是否试图共享相同的lua状态,并在情况下引发异常。还包括LUA和ObjectTranslator类的公共成员中的ReadOnly子句。

此版本包括luainterfaceloader.dll的来源,其中包括vs.net 2003项目文件。

Luainterface 1.2中的新功能

Luainterface现在可以作为模块加载,因此您可以使用Lua独立解释器来运行脚本。感谢Paul Winwood的这个想法和示例代码,展示了如何从C ++程序中加载CLR。该模块是“ NLua ”。确保lua可以找到NLua .lua,luainterfaceloader.dll在当前目录中或GAC中。这些样本现在以自己的命名空间加载Luainterface作为模块。

更改了get_method_bysig,get_constructor_bysig和make_object:现在,您将类型的名称传递给它们,而不是类型本身。例如:

get_method_bysig(obj,“方法”,“ system.string”)

而不是

字符串= import_type(“ system.string”)get_method_bysig(obj,“ method”,string)

确保已加载您正在加载的类型的组件,否则呼叫将失败。 SRC/testLuainterface/testlua.c中的测试用例具有新功能的示例。

下载源码

通过命令行克隆项目:

git clone https://github.com/NLua/NLua.git

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

左子网 开发教程 NLua https://www.zuozi.net/31727.html

abot
上一篇: abot
eShopOnContainers
下一篇: eShopOnContainers
常见问题
  • 1、自动:拍下后,点击(下载)链接即可下载;2、手动:拍下后,联系卖家发放即可或者联系官方找开发者发货。
查看详情
  • 1、源码默认交易周期:手动发货商品为1-3天,并且用户付款金额将会进入平台担保直到交易完成或者3-7天即可发放,如遇纠纷无限期延长收款金额直至纠纷解决或者退款!;
查看详情
  • 1、描述:源码描述(含标题)与实际源码不一致的(例:货不对板); 2、演示:有演示站时,与实际源码小于95%一致的(但描述中有”不保证完全一样、有变化的可能性”类似显著声明的除外); 3、发货:不发货可无理由退款; 4、安装:免费提供安装服务的源码但卖家不履行的; 5、收费:价格虚标,额外收取其他费用的(但描述中有显著声明或双方交易前有商定的除外); 6、其他:如质量方面的硬性常规问题BUG等。 注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。
查看详情
  • 1、左子会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全! 2、左子无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别; 3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外); 4、在没有”无任何正当退款依据”的前提下,商品写有”一旦售出,概不支持退款”等类似的声明,视为无效声明; 5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准); 6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在左子上所留的QQ、手机号沟通,以防对方不承认自我承诺。 7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于左子介入快速处理。
查看详情

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务