首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Nlua中使用C#静态字符串

如何在Nlua中使用C#静态字符串
EN

Stack Overflow用户
提问于 2014-03-26 15:42:37
回答 1查看 2K关注 0票数 1

我使用NLua作为我的应用程序的脚本接口。我想把键盘输入从LUA语言发送到我的C#代码。

我使用这个C#代码。

代码语言:javascript
复制
   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剧本里我做了

代码语言:javascript
复制
keypressC(Key.EnterC)
keypressS(Key.EnterS)

在keypressC中,Nlua的值为57351到key参数。没问题的。

在keypressS中,Nlua值"?“关键参数。是KO。我不知道为什么会有"?“这个字。看起来像是NLua中的封送错误(即LuaInterface)?

你能帮帮我吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-26 20:16:54

这是nLua/LuaInterface中的封送处理问题。

它使用Marshal.StringToHGlobalAnsi将字符串从C#封送到Lua。

它使用Marshal.PtrToStringAnsi将字符串从Lua封送到C#。

如果您通过这些函数往返您的示例字符串,您可以看到它再现了您的问题:

代码语言:javascript
复制
 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]);

输出:

代码语言:javascript
复制
?
?: 57351
?
?: 63

如果您将封送处理函数更改为使用Uni而不是Ansi,那么问题就解决了,但是您需要从源代码构建nLua/LuaInterface。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22666142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档