Как использовать статическую строку C# с Nlua
Я использую NLua для интерфейса скрипта с моим приложением. Я хочу отправить ввод с клавиатуры на языке LUA в мой код C#.
Я делаю с этим кодом C#.
using (Lua lua = new Lua())
{
lua.LoadCLRPackage();
lua.RegisterFunction("keypressC", null, typeof(TestNLUA).GetMethod("keypressC"));
lua.RegisterFunction("keypressS", null, typeof(TestNLUA).GetMethod("keypressS"));
lua["Key"] = new SpecialKey();
}
public class SpecialKey
{
public static readonly char EnterC = '\uE007';
public static readonly string EnterS = Convert.ToString(EnterC);
}
public class TestNLUA
{
public static void keypressC(char key)
{
// key = 57351 => OK
}
public static void keypressS(string key)
{
char[] akey = key.ToCharArray();
// akey[0] = 63 = ? (question mark) => KO
}
}
А в LUA Script я делаю
keypressC(Key.EnterC)
keypressS(Key.EnterS)
В keypressC Nlua передает значение 57351 в ключевой параметр. Все нормально.
При нажатии клавиш Nlua проходит значение "?" К ключевому параметру. Это нокаут Понятия не имею, почему появляется символ "?". Выглядит как ошибка маршалинга в NLua (т.е. LuaInterface)?
Вы можете мне помочь?
1 ответ
Это проблема маршалинга в nLua/LuaInterface.
Оно использует Marshal.StringToHGlobalAnsi
провести строку из C# в Lua.
Оно использует Marshal.PtrToStringAnsi
провести строку из Lua в C#.
Если вы выполните обход строки примера через эти функции, вы увидите, что она воспроизводит вашу проблему:
string test = "\uE007";
Console.WriteLine(test);
Console.WriteLine("{0}: {1}", test[0], (int) test[0]);
IntPtr ptr = Marshal.StringToHGlobalAnsi(test);
string roundTripped = Marshal.PtrToStringAnsi(ptr, test.Length);
Console.WriteLine(roundTripped);
Console.WriteLine("{0}: {1}", roundTripped[0], (int) roundTripped[0]);
Выход:
?
?: 57351
?
?: 63
Ваша проблема исчезнет, если вы измените используемые функции маршалинга Uni
вместо Ansi
, но вам нужно будет собрать nLua / LuaInterface из исходного кода.