LuaInterface - 如何从任何路径加载程序集?

时间:2012-12-10 18:27:29

标签: c# .net lua luainterface

我正在尝试使用LuaInterface加载.net程序集。如果我将程序集放在与我的可执行文件(以及我的LuaInterface.dll和LuaNet.dll)相同的文件夹中,那么一切都很好。我想将程序集移动到一个不同的文件夹,但是当我尝试时,我得到“用户代码中出现了一个.NET异常”。我试过了:

package.path = package.path .. "C:\\path\\to\\my\\assembly\\?.dll"
luanet.load_assembly("MyAssembly")

luanet.load_assembly("C:\\path\\to\\my\\assembly\\MyAssembly")

luanet.load_assembly("C:\\path\\to\\my\\assembly\\MyAssembly.dll")

所有这些都返回.NET异常错误。有没有办法定义LuaInterface使用的路径?

2 个答案:

答案 0 :(得分:0)

你的程序集由你的“托管”可执行文件加载,并没有真正由Lua环境本身加载。 luanet.load_assembly("MyAssembly")只是让Lua环境可以访问程序集。例如(C#):

using MyAssembly; //you can't compile unless MyAssembly is available

namespace LuaRunner
{
    class LuaRunner
    {        
        void DoLua()
        {
            using (LuaInterface.Lua lua = new LuaInterface.Lua())
            {
                lua.DoString("luanet.load_assembly('MyAssembly')");
                //... do what you want within Lua with MyAssembly
            }
        }
    }
}

您正在运行的程序是Lua在其中运行的“主机”,因此正在运行的程序实际加载MyAssembly。您的可执行文件需要对MyAssembly.dll的引用(并且需要能够在运行时在常用位置找到它)。

答案 1 :(得分:0)

要搜索其他装配,请设置package.cpath变量。例如:

package.cpath = DATA_DIR .. "\\clibs\\?.dll;" .. package.cpath

来自Lua 5.1 documentation

require(modname)

  

首先要求查询package.preload [modname]。如果它有一个值,那么这个值(应该是一个函数)就是加载器。否则,需要使用package.path中存储的路径搜索Lua加载程序。如果失败,它将使用package.cpath中存储的路径搜索C加载程序。

package.cpath

  

require用于搜索C加载程序的路径。

     

Lua初始化C路径package.cpath的方式与初始化Lua路径package.path的方式相同,使用环境变量LUA_CPATH或luaconf.h中定义的默认路径。