二进制模块加载器

lua-users home
wiki

这是一个二进制模块加载器的示例,与 Lua 提供的独立加载器类似。您可以使用它来实现更复杂的加载器。 (JeromeVuarand)

module(..., package.seeall)

local function load(modulename)
  local errmsg = ""
  -- Find DLL
  local symbolname = string.gsub(modulename, "%.", "_")
  local modulepath = string.gsub(modulename, "%.", "/")
  for path in string.gmatch(package.cpath, "([^;]+)") do
    local filename = string.gsub(path, "%?", modulepath)
    local file = io.open(filename, "rb")
    if file then
      file:close()
      -- Load and return the module loader
      local loader,msg = package.loadlib(filename, "luaopen_"..symbolname)
      if not loader then
        error("error loading module '"..modulename.."' from file '"..path.."':\n\t"..msg, 3)
      end
      return loader
    end
    errmsg = errmsg.."\n\tno file '"..filename.."' (checked with custom loader)"
  end
  return errmsg
end

-- Install the loader so that it's called just before the normal binary loader
table.insert(package.loaders, 3, load)


此页面上的术语可以改进。这是一个“搜索函数”,它返回一个“加载器” [1]。 (遗憾的是,package.loaders 没有命名为 package.searchers。)此外,术语“二进制模块”可能错误地暗示了 Lua 字节码文件;我建议使用“C 库”,如参考手册中所述(或“共享库”)。 因此,我建议将页面重命名为“Lua 中的 C 库搜索函数?”(当前此 wiki 上有四个其他“*InLua?”页面)。 --DavidManura

最近更改 · 偏好设置
编辑 · 历史记录
上次编辑于 2009 年 9 月 6 日凌晨 4:01 GMT (差异)