Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以在Nlua中使用静态类吗?_C#_Xamarin_Lua_Nlua - Fatal编程技术网

C# 我可以在Nlua中使用静态类吗?

C# 我可以在Nlua中使用静态类吗?,c#,xamarin,lua,nlua,C#,Xamarin,Lua,Nlua,首先也是最重要的一点,我不是以英语为母语的人,对于这个问题可能产生的任何沟通错误,我深表歉意。另外,我不能真正理解你提出问题的一些指导原则,所以按照我的理解去做。因此,如果我违反了任何习俗,请告诉我 背景 我一直在制作一个应用程序,试图实现类似xaml的代码热重载。由于我不能直接使用c#之类的编译语言,我决定使用第三方脚本语言,我想我可以在其中编写一点应用程序逻辑,然后更快地将其部署到设备上,因为我只需按一个按钮就可以将代码发送出去。所以,你可以把它想象成是世界博览会的客户 我决定使用lua作为

首先也是最重要的一点,我不是以英语为母语的人,对于这个问题可能产生的任何沟通错误,我深表歉意。另外,我不能真正理解你提出问题的一些指导原则,所以按照我的理解去做。因此,如果我违反了任何习俗,请告诉我

背景 我一直在制作一个应用程序,试图实现类似xaml的代码热重载。由于我不能直接使用c#之类的编译语言,我决定使用第三方脚本语言,我想我可以在其中编写一点应用程序逻辑,然后更快地将其部署到设备上,因为我只需按一个按钮就可以将代码发送出去。所以,你可以把它想象成是世界博览会的客户

我决定使用lua作为脚本语言,不仅因为它编写代码非常简单,而且因为它有一个很好的.net绑定,当然我说的是Nlua。而且,由于ironpython3还没有准备好投入生产,老实说,我有什么选择呢

我面临的问题 因此,由于我必须绑定一些xamarin.essentials的东西以使我更容易编写应用程序的lua端,因此我必须与一些具有静态方法的对象进行交互。我认为在Nlua中使用静态方法是非常直观和直接的,尽管到目前为止我似乎错了

如何重现这个问题
  • 因此,在VisualStudio中,创建一个xamarin.forms项目,随意命名,这并不重要
  • 接下来,将Nlua nuget包添加到所有项目中。它需要集成到所有这些插件中,因为它与一些xamarin.forms插件一样,依赖于本机库来工作,因此需要将它们包含在适当的位置,以便操作系统找到它们。当安装在受支持的项目类型中时,软件包会自动执行此操作,请执行此操作
  • 将Nlua命名空间添加到主页内容页的codebehind顶部,如下所示:
  • 使用NLua;
    
  • 为了便于将来使用,请向MainPage类添加类级属性,如下所示:
  • Lua LuaState{get;set;}
    
  • 现在,为了简单起见,在页面构造函数中初始化它:
  • LuaState=newlua();
    
  • 在页面的xaml中,添加一个用于输入文本的编辑字段和一个能够运行该文本的按钮:
  • 
    
  • 在单击按钮的处理程序中,添加代码以加载编辑框中的内容,然后让nlua执行它,如下所示:
  • 现在,添加一个新类,随意调用,我调用了我的tts。删除vs生成的文件中的所有内容,然后在其中添加以下内容:
  • 回到主内容类中,在构造函数或从构造函数调用的专用方法中,注册lua类型,如下所示:
  • 预期行为 如果使用
    表示法,它应该说出给定给函数的参数,例如tts.speak(“hello world”)

    实际行为 执行带有
    符号的调用时,lua解释器抛出以下错误:

    [字符串“chunk”]:1:尝试调用nil值(字段“speak”)

    到目前为止我所尝试的
  • 首先,我尝试用typeof关键字获取静态对象的类型,然后直接将其注册为lua可访问值,如上面所示。正如您所看到的,这引发了一个错误
  • 例如,如果我试图像函数一样调用类型以获得文档中所示的新对象,那么它将再次失败
  • 如果我使用
    State.UseClrPackage()方法,然后手动导入内容,它也不起作用,无法访问任何方法或变量,lua说它们都是“nill”
  • 注意:仔细检查后,我发现变量lua sees实际上是真正的clr类型,因为lua的str函数显示了完整的类型限定符,如.net中所示。但是,type函数返回userdata

  • 我尝试创建一个名为的lua表,然后添加键-值对,其中键是方法名,值是静态对象的方法,正如typeof(thing).GetMethod(MethodName)转换为LuaFunction类型所返回的那样,而不是使整个类型对lua可见。 这在某种程度上起到了作用,尽管它很快就变得太复杂和让我不知所措,所以我停止使用这种方法,因为我的代码库非常复杂

  • 我尝试的另一件事是为静态对象创建proxi对象,在静态对象中没有任何东西是实际静态的,即使这些方法返回void并作用于静态属性

  • 这一点同样有效,但我必须使用object:thing,而静态方法的标准是object.thing。如果我尝试使用object.thing表示法,我会得到一个相当长的错误,尽管我确信它的内容与手头的问题无关,所以不打算在这里包含它

    结论
    所以,正式地说,我尝试了我能做的一切,甚至在这里做了一次搜索,看看我是否能找到任何启发我的东西,尽管不幸的是,没有运气。现在,你推荐我用什么?有什么地方我忽略了吗?

    欢迎来到Stack Overflow。你的问题相当冗长和详细,我建议将问题简化为一个简单的问题,我编辑了这个问题,希望能够解决结束它背后的原因。我做的最重要的事情是添加一组最小的指令来重现我遇到的问题。注意:我尝试了我能想到的一切,无法解决屏幕阅读器中出现的格式问题,但其中一些问题仍然存在,原因不明。
        async void btnStartCode_Clicked(object sender, EventArgs e)
        {
            try
            {
                LuaState.DoString(edCode.Text);
            }
            catch (Exception exc)
            {
                await DisplayAlert("error", $"A fatal error was incountered while running your code\nException details:\n\tException type: {exc.GetType().ToString()}\n\terror message from interpreter:{exc.Message}.", "OK");
            }
    
        }
    
        using System;
        
            using System.Collections.Generic;
            using System.Text;
            using Xamarin.Essentials;
            namespace autoaccess.scriptables
            {
                public class tts
                {
                    public async void speak(params object[] messages)
                    {
                        foreach(var message in messages)
                        {
                            if (message == null)
                            {
                                await TextToSpeech.SpeakAsync("null value");
                                return;
                            }
                            await TextToSpeech.SpeakAsync(message.ToString());
                        }
                    }
                }
            }
    
    LuaState["text_to_speech"=typeof(TextToSpeech);