| 你好呀! |
|---|
感谢您检查该项目。
我们已经制作了项目开源和麻省理工学院许可证,以便每个人都可以享受它。
要提供一个质量的项目,我们必须花费大量时间来研究它。
如果您喜欢该项目,请出演它。
我们还应支持任何赞助商[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用户列表
团结整合
-
为.NET 2.0构建或从Nuget下载Keralua和NLua (使用下载软件包链接)
-
如果下载:将文件扩展名从.nupkg更改为.zip
-
在您的Unity Project的资产目录插件/ keralua和插件/ NLua中创建文件夹
-
将这些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
-
浏览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中的测试用例具有新功能的示例。
