2

我正在尝试使用 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 使用的路径?

4

2 回答 2

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 的引用(并且需要能够在运行时在通常的位置找到它)。

于 2013-01-07T19:05:21.240 回答
0

要搜索其他程序集,请设置package.cpath变量。例如:

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

Lua 5.1 文档

要求(模组名)

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

包.cpath

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

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

于 2015-02-12T13:40:39.623 回答