听起来有点可怕不是吗?
一些背景信息,我想使用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)