小编gra*_*ans的帖子

如何在C#中实现Lua容器(虚拟文件系统)模块加载器

听起来有点可怕不是吗?

一些背景信息,我想使用LuaInterface将包含一些lua模块的tar存档加载到我的C#应用​​程序中.最简单的方法是将这些文件解压缩到临时文件夹,修改lua模块搜索路径并像往常一样用require读取它们.但我不想把这些脚本放在文件系统的某个地方.

所以我认为应该可以使用#ziplib加载tar-archive 我知道有很多用于tar的lua实现和类似的东西.但#zlib已经是该项目的一部分.

成功将文件作为字符串(流)从存档中加载后,我应该能够通过LuaInterface将它们传递给C#中的lua.DoString(...).

但是,如果模块有这样的行,那么简单地通过dostring或dofile加载模块就不起作用了:"module(...,package.seeall)"有一个错误报告,比如将参数1传递给nil,但是字符串是预期的.

另一个问题是模块可能依赖于也位于tar存档中的其他模块.

一种可能的解决方案应该是定义这里描述的自定义加载器.

我的想法是使用#ziplib在C#中实现这样的加载器,并将此加载器映射到我的C#应用​​程序的lua堆栈中.

你们中有谁有类似的任务吗?有没有现成的解决方案已经解决了这样的问题?

tar文件不是必须的,但包装格式很好.

这个想法是可行还是完全不可行?

我写了一些示例类来从存档中提取lua文件.此方法用作加载器并返回lua函数.

namespace LuaInterfaceTest
{
 class LuaTarModuleLoader
 {
    private LuaTarModuleLoader() { }
    ~LuaTarModuleLoader()
    {
        in_stream_.Close();
    }
    public LuaTarModuleLoader(Stream in_stream,Lua lua )
    {
        in_stream_ = in_stream;
        lua_ = lua;
    }

    public LuaFunction load(string modulename, out string error_message)
    {
        string lua_chunk = "test=hello";
        string filename = modulename + ".lua";
        error_message = "Unable to locate the file";
        in_stream_.Position = 0; // rewind
        Stream gzipStream = new BZip2InputStream(in_stream_);
        TarInputStream …
Run Code Online (Sandbox Code Playgroud)

c# lua module tar luainterface

5
推荐指数
1
解决办法
3506
查看次数

标签 统计

c# ×1

lua ×1

luainterface ×1

module ×1

tar ×1