2012-12-10 14 views
2

我想使用LuaInterface加載.net程序集。如果我將程序集放在與我的可執行文件(以及我的LuaInterface.dll和LuaNet.dll)相同的文件夾中,那麼一切都很好。我想將程序集移動到不同的文件夾中,但是當我嘗試獲取「用戶代碼中發生.NET異常」時。我曾嘗試:LuaInterface - 如何從任何路徑加載程序集?

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

你的程序集是由你的「託管」可執行文件加載的,並且沒有真正由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的引用(並且需要能夠在運行時在通常位置找到它)。

0

要搜索其他程序集,請設置package.cpath變量。例如:

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

Lua 5.1 documentation

要求(的modname)

首先需要package.preload [的modname]查詢。如果它有一個值,這個值(這應該是一個函數)是加載器。否則,需要使用存儲在package.path中的路徑搜索Lua加載程序。如果這也失敗了,它將使用存儲在package.cpath中的路徑搜索C加載器。

package.cpath

由所使用的路徑需要以搜索一個C加載器。

Lua使用環境變量LUA_CPATH或luaconf.h中定義的默認路徑,以與初始化Lua路徑package.path相同的方式初始化C路徑package.cpath。

相關問題