Как вызвать из C # Lua-функцию в Lua-скрипте, который имеет «require»? - PullRequest
0 голосов
/ 19 февраля 2012

У меня есть программа на C #, выполняющая сценарии Lua с использованием LuaInterface. Пока что это работает хорошо, если мой сценарий 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 первой книги.

Кроме того, как уже упоминалось, я мог вызывать функции Lua из C # до тех пор, пока в скрипте нет 'require'. Это не только LuaXML, который генерирует этот тип исключения. Любой пакет будет.

Я играл с переменными окружения, но не смог. Однако я не очень хорош в этом.

Заранее спасибо за помощь.

1 Ответ

1 голос
/ 20 февраля 2012

Вы должны поместить совместно используемую библиотеку LuaXML в одну из этих расположений (см. Вывод, особенно последние строки, которые ищут DLL), чтобы Lua require мог ее найти.Кроме того, вы можете изменить package.cpath, чтобы указать, где хранится ваша DLL LuaXML.Пример:

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