nlua
2025/9/8大约 1 分钟约 362 字
nlua 简介
c# 常用lua库初始化lua
this.lua = new Lua();
this.lua.DoString("require 'math'");
this.lua.DoString("require 'string'");
// 注册dialog
this.lua.RegisterFunction("Dialog", typeof(Dialog).GetConstructor(Type.EmptyTypes));
useLuaScriptManager = new UseLuaScriptManager("script",lua);1. c#懒加载缓存FILE 并且执行脚本 以路径文件为缓存对象
class UseLuaScriptManager : IDisposable {
private readonly Lua lua;
private readonly string _basePath;
// 全局脚本缓存(文件内容)
private static readonly ConcurrentDictionary<
string, string > _scriptContentCache = new ConcurrentDictionary<string, string>();
public UseLuaScriptManager(string basePath = "script", Lua lua = null)
{
_basePath = basePath;
this.lua = lua;
}
public Object[] ExecuteScript (string path, string name, params object[] args)
{
var scriptPath = Path.Combine(_basePath, path, $"{name}.lua");
if (!File.Exists(scriptPath)) {
LogAction.LogOut("脚本路径未找到: " + scriptPath, LogType.Err);
return null;
}
// 从全局缓存获取或加载脚本内容
string scriptContent = _scriptContentCache.GetOrAdd(scriptPath, scriptPathKey = >
{
return File.ReadAllText(scriptPathKey, Encoding.Default);
});
Console.WriteLine($"cache lua content count: {_scriptContentCache.Keys.Count}");
try {
lua.DoString(scriptContent);
var function = lua.GetFunction("main");
return args == null ? function.Call() : function.Call(args);
} catch (Exception ex) {
Console.WriteLine(ex);
//throw new Exception($"Error executing Lua script '{name}.lua'", ex);
return null;
}
}
public static void clear() {
_scriptContentCache.Clear();
}
}2. LUA使用require代替缓存
package.path 结合require使用自带缓存功能 public static void testLua() {
// 默认支持加载8层目录
lua.DoString(@"
-- 自动生成支持 1~N 层子目录的路径规则
local base_path = './script/'
local path_rules = ';' .. base_path .. '?.lua'
-- 生成 1~8 层子目录规则(可根据需要调整数字)
for i = 1, 8 do
path_rules = path_rules .. ';' .. base_path .. string.rep('?/', i) .. '?.lua'
end
package.path = package.path .. path_rules
");
// 直接通过require加载 并执行函数
((NLua.LuaFunction)((LuaTable)lua.DoString("return require 'test'")[0])["test"]).Call();
((NLua.LuaFunction)((LuaTable)lua.DoString("return require 'test1'")[0])["test"]).Call();
((NLua.LuaFunction)((LuaTable)lua.DoString("return require 'test'")[0])["test"]).Call();
}