如何从C#中调用一个Lua函数,该函数存在于一个具有“require”的Lua脚本中?

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

我想从C#向Lua函数发送XML字符串。

这是保存在C:\ temp中的XML:

<?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);

这是保存在C:\ temp上的Lua脚本:

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:找不到模块“LuaXML”:
无字段包。预加载['LuaXML']
没有文件'。\ LuaXML.lua'
没有文件'C:\ Program Files(x86)\ Common Files \ Microsoft Shared \ DevServer \ 10.0 \ lua \ LuaXML.lua'
没有文件'C:\ Program Files(x86)\ Common Files \ Microsoft Shared \ DevServer \ 10.0 \ lua \ LuaXML \ init.lua'
没有文件'C:\ Program Files(x86)\ Common Files \ Microsoft Shared \ DevServer \ 10.0 \ LuaXML.lua'
没有文件'C:\ Program Files(x86)\ Common Files \ Microsoft Shared \ DevServer \ 10.0 \ LuaXML \ init.lua'
没有文件'C:\ Program Files(x86)\ Lua \ 5.1 \ lua \ LuaXML.luac'
没有文件'。\ LuaXML.dll'
没有文件'C:\ Program Files(x86)\ Common Files \ Microsoft Shared \ DevServer \ 10.0 \ LuaXML.dll'
没有文件'C:\ Program Files(x86)\ Common Files \ Microsoft Shared \ DevServer \ 10.0 \ loadall.dll'

我必须手动将所有这些文件(.lua、.dll)放到所有这些位置吗?

当我从Lua控制台执行Lua脚本时,它可以正常工作。它返回第一本书的_id_10。

另外,如上所述,只要脚本中没有'require',我就可以从C#调用Lua函数。不仅是LuaXML会抛出这种类型的异常,任何软件包都会这样。

我尝试过操作系统环境变量,但没有成功。但是,我不是很擅长这方面。

提前感谢您的帮助。

原文链接 https://stackoverflow.com/questions/9351948

点赞
stackoverflow用户221509
stackoverflow用户221509

你必须把 LuaXML 共享库放到其中一个位置(参见输出,特别是找 DLL 的最后几行),这样 Lua 的 require 才能找到它。或者,你可以改变 package.cpath 来指向你保存 LuaXML DLL 的位置。示例:

package.cpath = package.cpath .. ";./libs/?.dll"
2012-02-19 21:38:50