我使用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)?
你能帮帮我吗?
发布于 2014-03-26 20:16:54
这是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。
https://stackoverflow.com/questions/22666142
复制相似问题