【问题标题】:How to call from C# a Lua function in a Lua script that has a "require"?如何从 C# 调用具有“要求”的 Lua 脚本中的 Lua 函数?
【发布时间】:2025-12-19 10:40:06
【问题描述】:

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

我想将 XML 字符串从 C# 发送到 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。任何包裹都可以。

我玩过环境变量,但没有成功。但是,我不是很擅长。

提前感谢您的帮助。

【问题讨论】:

    标签: c# lua luainterface


    【解决方案1】:

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

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

    【讨论】:

    • 既没有 LuaXMl.luac 文件(后缀有 c),也没有 LuaXML.dll(只有 LuaXML_lib.dll)。但是,我必须输入 require("LuaXML") 才能让脚本直接工作(而不是来自 C#)。我无权访问 Microsoft 共享文件夹。它告诉我,我必须成为一名管理员(顺便说一句,我是一名管理员)。我在很多地方都尝试过 package.cpath:从控制台或脚本中。它也不起作用。我相信这很简单,而且我可能遗漏了一些东西。如果您有任何其他可以提供帮助的说明,请提前致谢。