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 は値「?」を渡します。キーパラメータに。コです。なぜ「?」という文字があるのか​​わかりません。NLua (つまり LuaInterface) のマーシャリング エラーのように見えますか?

手伝って頂けますか?

4

1 に答える 1

1

これは nLua/LuaInterface のマーシャリングの問題です。

Marshal.StringToHGlobalAnsiC# から Lua に文字列をマーシャリングするために使用します。Lua から C# に文字列をマーシャリングするため
に使用します。Marshal.PtrToStringAnsi

これらの関数を使用してサンプル文字列を往復すると、問題が再現されていることがわかります。

 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 に答える