1

我正在使用 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脚本中我做

keypressC(Key.EnterC)
keypressS(Key.EnterS)

在 keypressC 中,Nlua 将值 57351 传递给 key 参数。没关系。

在 keypressS 中,Nlua 传递值“?” 到关键参数。是KO​​。我不知道为什么会有字符“?”。看起来像是 NLua 中的编组错误(即 LuaInterface)?

你能帮助我吗?

4

1 回答 1

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。

于 2014-03-26T20:16:54.817 回答