Как использовать статическую строку 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 из исходного кода.

Другие вопросы по тегам