我正在尝试使用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使用的路径?
答案 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
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中定义的默认路径。