NLua调用自定义程序集问题:SomeClass始终为nil求解
SomeClass始终返回nil的问题 嘿,我之前在NLua里调用自己写的.NET类时也踩过一模一样的坑!咱们一步步来排查问题:
先搞定程序集的加载路径
NLua不像系统自带的.NET程序集(比如System.dll)那样能自动找到你的自定义程序集。如果你的SomeClass.dll和Lua脚本不在同一个文件夹里,要么把dll移到脚本目录,要么在import里写全dll的绝对路径:import ('D:\\Projects\\MyLuaApp\\SomeClass.dll', 'SomeClass')直接写绝对路径是最不容易出错的方式。
别漏了命名空间!
这是最容易犯的错——如果你的SomeClass是放在某个命名空间下的(比如MyApp.CustomClasses.SomeClass),那import的第二个参数必须写完整的命名空间+类名,不能只写SomeClass:import ('SomeClass', 'MyApp.CustomClasses.SomeClass')要是你的类没加命名空间,这一步可以跳过,但最好去C#代码里确认一下。
检查类和构造函数的访问权限
.NET里默认类的访问级别是internal,NLua根本访问不到非public的类型!所以你的类必须定义成public class SomeClass,而且构造函数也得是public的,不然Lua里根本看不到这个类:public class SomeClass { public SomeClass() { } // 必须是public构造函数,不然Lua没法实例化 public string Func1() { return "Test"; } }确保框架版本兼容
你的SomeClass程序集的目标.NET框架版本,必须和NLua运行时用的框架版本一致。比如如果NLua是跑在.NET Framework 4.8上,你的dll也得编译成这个版本,不然会加载失败导致类为nil。换个加载方式试试
如果import还是不好使,可以直接用LoadAssembly先加载程序集,再手动获取类型:-- 先加载程序集 local assembly = lua.LoadAssembly('SomeClass') -- 获取类型,带命名空间的话要写全 local SomeClassType = assembly:GetType('SomeClass') -- 实例化对象 myclass = SomeClassType() -- 调用方法 local result = myclass:Func1()
那些示例用标准.NET程序集没问题,是因为它们默认在全局程序集缓存(GAC)里,NLua能直接找到,而你的自定义dll不在GAC,所以路径和权限这些细节一定要盯紧。
内容的提问来源于stack exchange,提问作者Helmut

