如何从C#调用Lua脚本中的Lua函数;要求”;

本文关键字:Lua 函数 要求 脚本 调用 | 更新日期: 2023-09-27 18:25:17

我有一个C#程序使用LuaInterface执行Lua脚本。到目前为止,它运行得很好,除非我的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: 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。任何包裹都可以。

我玩过环境变量,但没有成功。然而,我不太擅长这一点。

提前感谢您的帮助。

如何从C#调用Lua脚本中的Lua函数;要求”;

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

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