如何在具有“require”的Lua脚本中从C#调用Lua函数?

时间:2012-02-19 18:34:47

标签: c# lua luainterface

我有一个C#程序使用LuaInterface执行Lua脚本。到目前为止,它运行良好,除非我的Lua脚本需要特定的包,如LuaXML。

我想将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 个答案:

答案 0 :(得分:1)

您必须将LuaXML共享库放入这些位置的一个中(请参阅输出,尤其是查找DLL的最后一行),以便Lua require可以找到它。或者,您可以将package.cpath更改为指向保存LuaXML DLL的位置。例如:

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