2012-02-19 74 views
0

我有一個C#程序使用LuaInterface執行Lua腳本。到目前爲止,它運行良好,除非我的Lua腳本需要特定的包,比如LuaXML。如何從C#調用一個Lua腳本中有一個「require」的函數?

我想從C#發送一個XML字符串到一個Lua函數。

這是XML,保存在C:\ TEMP:

<?xml version="1.0" encoding="utf-16" ?> 
<library id="101"> 
    <book id="10" author="Balzac" title="Le Père Goriot"></book> 
    <book id="20" quantity="Stendhal" price="Le Rouge et le noir"></book> 
</library> 

這是C#代碼:

 Lua lua = new Lua(); 

     XmlDocument xmlDocument = new XmlDocument(); 

     xmlDocument.Load(@"C:\temp\library.xml"); 

     lua.DoFile(@"C:\temp\myScript.lua"); 

     LuaFunction luaFunction = lua.GetFunction("transformXML"); 
     Object o = luaFunction.Call(xmlDocument.OuterXml); 

這是Lua的腳本,保存基於C \ TEMP:

require("LuaXML") 

function transformXML(input) 

x = xml.eval(input) 

output = nil 

local library = x:find("library") 

return library[1].id 

end 


local s = '<?xml version="1.0" encoding="utf-16" ?><library id="101"><book id="10" author="Balzac" title="Le Père Goriot"></book><book id="20" quantity="Stendhal" price="Le Rouge et le noir"></book></library>' 

print(transformXML(s)) 

這是我得到的錯誤:

C:\temp\myScript.lua:1: module 'LuaXML' not found: 
no field package.preload['LuaXML'] 
no file '.\LuaXML.lua' 
no file 'C:\Program Files (x86)\Common Files\Microsoft Shared\DevServer\10.0\lua\LuaXML.lua' 
no file 'C:\Program Files (x86)\Common Files\Microsoft Shared\DevServer\10.0\lua\LuaXML\init.lua' 
no file 'C:\Program Files (x86)\Common Files\Microsoft Shared\DevServer\10.0\LuaXML.lua' 
no file 'C:\Program Files (x86)\Common Files\Microsoft Shared\DevServer\10.0\LuaXML\init.lua' 
no file 'C:\Program Files (x86)\Lua\5.1\lua\LuaXML.luac' 
no file '.\LuaXML.dll' 
no file 'C:\Program Files (x86)\Common Files\Microsoft Shared\DevServer\10.0\LuaXML.dll' 
no file 'C:\Program Files (x86)\Common Files\Microsoft Shared\DevServer\10.0\loadall.dll' 

我必須手動將所有這些文件(.lua,.dll)到所有這些位置嗎?

Lua腳本在我從Lua控制檯執行時起作用。它返回10,第一本書的ID。另外,如前所述,只要腳本中沒有'require',我就可以從C#中調用Lua函數。不僅僅是LuaXML引發這種異常。任何包都可以。

我玩過環境變量,但沒有成功。不過,我並不擅長這一點。

非常感謝您的幫助。

回答

1

您必須將LuaXML共享庫放入這些位置的一個(請參閱輸出,尤其是查找DLL的最後一行),以便Lua require可以找到它。或者,您可以將package.cpath更改爲保存LuaXML DLL的位置。例如:

package.cpath = package.cpath .. ";./libs/?.dll" 
+0

謝謝米哈爾,但我到目前爲止嘗試不起作用。 – 2012-02-20 03:16:53

+0

既沒有LuaXMl.luac文件(後綴爲c),也沒有LuaXML.dll(只有LuaXML_lib.dll)。但是,我必須將腳本直接使用require(「LuaXML」)(而不是C#)。我無權訪問Microsoft Shared文件夾。它告訴我,我必須是一個管理員(我是一個,順便說一句)。我已經在許多地方嘗試了package.cpath:從控制檯或腳本中。它也不起作用。我相信這很簡單,我可能錯過了一些東西。如果您有任何其他可以提供幫助的說明,請事先致謝。 – 2012-02-20 03:34:15

相關問題