Bolt界面引擎官方论坛

 找回密码
 立即注册
搜索
查看: 2757|回复: 3

我照着例子的MyClass写了TestClass一直不能过

[复制链接]
发表于 2013-8-30 11:32:11 | 显示全部楼层 |阅读模式
internal sealed class TestClass
    {
        public event Action<int> OnCheckName;
        public int CheckName(string str)
        {
            int result = 0;
            if (OnCheckName != null)
            {
                result = str.Length;
                OnCheckName(result);
            }
            return result;
        }
    }

[LuaClass(CreatePolicy.Factory)]
    internal sealed class LuaTestClass : LuaBaseClass<TestClass, LuaTestClass>
    {
        [LuaClassMethod]
        private static bool CheckName(IntPtr L)
        {
            var instance = GetInstance(L);          //通过父类的GetInstance(L)方法获取BOLT环境下通过工厂类创建的MyClass实例
            var left = L.GetString(2);               //获取Lua栈的第2个元素
            var result = instance.CheckName(left); //调用MyClass的Add方法
            L.PushInt32(result);                    //将计算结果Push到Lua栈,L.PushXXX是一系列扩展方法,方便将C#数据Push到Lua栈
            //参考:ComicDown.UI.COre/Bolt.NET/LuaExtension.cs

            return true;                               //1表示往Lua栈里Push了一个元素
        }

        [LuaClassMethod]
        private static int NAttachResultListener(IntPtr L)
        {
            var instance = GetInstance(L);          //通过调用父类的GetInstance(L)方法获取BOLT环境下通过工厂类创建的MyClass实例           
            if (!L.IsLuaFunction(-1)) return 0;     //判断Lua栈的栈顶元素是否为function

            //
            //调用L.ToAction<T>(Action<T> caller)扩展方法将Lua栈顶function转为C#的Action<T>委托
            //其中caller用来具体将委托的参数Push到Lua栈,并通过L.Call(int arg,int ret)调用Lua的function
            //   arg表示Push到Lua栈的元素个数
            //   ret表示Lua function的返回值个数
            //
            var function = L.ToAction<int>(result =>
            {
                L.PushInt32(result);  //将resultPush到Lua栈
                L.Call(1, 0);         //调用Lua的方法,1表示参数个数为1,0表示返回值个数为0
            });

            instance.OnCheckName += function; //将转换后的委托添加到MyClass实例的OnAddFinish事件上
            return 0;                         //此处并没有往Lua栈里Push元素,故返回0
        }
    }
bolt.Run(xarSearchPath, xarName, () => {
                //
                //请在此处注册C#类或对象给BOLT环境
                //
                LuaMyClass.Register();
                LuaApplication.Register();

                LuaTestClass.Register();
            });

LuaTestClass.Register();一直报错
请问是什么原因

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
发表于 2013-8-30 13:50:11 | 显示全部楼层
[LuaClassMethod]
private static bool CheckName(IntPtr L)

这个不行,注册函数的返回值必须是int,表示你往栈里面Push的元素个数,此处你只有一个L.PushInt32(result),所以返回值必须是 return 1。你要改成:
  1. [LuaClassMethod]
  2. private static int CheckName(IntPtr L){
  3.    var instance = GetInstance(L);
  4.    var name = L.GetString(2)
  5.    var result = instance.CheckName(name);
  6.    L.PushInt32(result);
  7.    return 1;
  8. }
复制代码
发表于 2013-8-30 13:51:16 | 显示全部楼层
你要认真看代码的注释啊,我在每句代码的注释里都写得很清楚了每句代码是干嘛的。
 楼主| 发表于 2013-8-30 14:33:30 | 显示全部楼层
哦哦  好的, 谢谢

小黑屋|手机版|迅雷Bolt界面引擎开发者社区 ( 10240715

GMT+8, 2017-6-26 06:29 , Processed in 0.073590 second(s), 17 queries .

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表