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

他のアセンブリを検索するには、package.cpath変数を設定します。例えば:

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

Lua 5.1 ドキュメントから:

require (modname)

まず、クエリ package.preload[modname] を必要とします。値がある場合、この値 (関数である必要があります) がローダーです。それ以外の場合は、package.path に格納されているパスを使用して Lua ローダーを検索する必要があります。それも失敗した場合は、package.cpath に格納されているパスを使用して C ローダーを検索します。

package.cpath

C ローダーを検索するために require によって使用されるパス。

Lua は、環境変数 LUA_CPATH または luaconf.h で定義されたデフォルト パスを使用して、Lua パス package.path を初期化するのと同じ方法で C パス package.cpath を初期化します。

于 2015-02-12T13:40:39.623 に答える
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 に答える