将用户输入作为字符串并将其转换为可执行代码C#

将用户输入作为字符串并将其转换为可执行代码C#,c#,unity3d,C#,Unity3d,嗨,我是C#的新手,我正在尝试创建一个应用程序,它接受用户输入并将其转换为代码,然后运行它。我遵循了一些指南,但每次都会遇到同样的错误。我正在使用Microsoft.Csharp和system.codedom。有没有其他方法可以做到这一点,或者有人可以帮我解决这个错误。这段代码是我的unity游戏的一部分,放在我的一个脚本中 程序集“System.CodeDom”中类型“Microsoft.CSharp.CSharpCodeProvider”的类型转发器会导致一个循环,我一直都会收到此错误。我能

嗨,我是C#的新手,我正在尝试创建一个应用程序,它接受用户输入并将其转换为代码,然后运行它。我遵循了一些指南,但每次都会遇到同样的错误。我正在使用Microsoft.Csharp和system.codedom。有没有其他方法可以做到这一点,或者有人可以帮我解决这个错误。这段代码是我的unity游戏的一部分,放在我的一个脚本中

程序集“System.CodeDom”中类型“Microsoft.CSharp.CSharpCodeProvider”的类型转发器会导致一个循环,我一直都会收到此错误。我能找到的所有例子都非常古老,它们都会导致相同的错误。我在microsoft.codedom.providers.dotnetcompilerplatform中遇到了相同的错误

    private static string CreateExecuteMethodTemplate(string content)
    {
    var builder = new StringBuilder();

    builder.Append("using System;");
    builder.Append("\r\nnamespace Lab");
    builder.Append("\r\n{");
    builder.Append("\r\npublic sealed class Cal");
    builder.Append("\r\n{");
    builder.Append("\r\npublic static object Execute()");
    builder.Append("\r\n{");
    builder.AppendFormat("\r\nreturn {0};", content);
    builder.Append("\r\n}");
    builder.Append("\r\n}");
    builder.Append("\r\n}");

    return builder.ToString();
}

private static object Execute(string content)
{
    var codeProvider = new CSharpCodeProvider();

    var compilerParameters = new CompilerParameters
    {
        GenerateExecutable = false,
        GenerateInMemory = true
    };

    compilerParameters.ReferencedAssemblies.Add("system.dll");

    string sourceCode = CreateExecuteMethodTemplate(content);
    CompilerResults compilerResults = codeProvider.CompileAssemblyFromSource(compilerParameters, 
    sourceCode);
    Assembly assembly = compilerResults.CompiledAssembly;
    Type type = assembly.GetType("Lab.Cal");
    MethodInfo methodInfo = type.GetMethod("Execute");

    return methodInfo.Invoke(null, null);
}

考虑到你对游戏性的想法,我相信你最好设计一套游戏内的指令,而不是“允许你的用户实际编码”

我知道这并不完全是对你问题的回答,但我想提出一种解决这个问题的替代方法

想象一下,在游戏中,您为他们提供了一个简化的IDE和定制的简单“脚本语言”,然后在游戏引擎中解析为动作

您可以从以下形式的教程级别开始:

  • 屏幕的左半部分可以是当前状态的可视化(如果人们能够直观地看到他们的代码实际在做什么,他们会发现它更加直观)-例如,一个黄色的正方形表示玩家的位置,一个绿色的正方形表示玩家应该到达的位置
  • 屏幕的右半部分将成为播放器的IDE
  • 现在,您可以设计一些游戏内命令,例如:“Move(intxdirection,intydirection)”或“Do(x次)” 玩家可以在IDE示例代码中编写脚本,例如:

       Do(10)
       {
           Move(0, +1);
       }
    
    一旦玩家“运行”代码,他就会看到黄色方块向上移动“10个单位”


    为了便于查看,您可以在每次“执行”循环之间暂停片刻,以便注意每次循环重复中发生的情况。

    C#并不是真正意义上的脚本语言。Unity应用程序通常使用Lua编写脚本。不确定这是否是问题所在,但
    返回{0}内容的值使用了什么?是的,我的游戏有一个终端和一些按钮,在终端中添加了一些预定义的代码,我决定用一种完全不同的方式解决这个问题。我将手动读取输入字符串,并在字符串中使用这些预定义的方法,并执行与这些字符串相关的一些函数。我最初的想法是直接将输入字符串转换成C代码,但这有点冒险,我无法让它工作。是的,这正是我的想法和建议。我相信这是创建游戏的有效方法。你最初的想法中充斥着一定会爆炸的东西。我会祈祷的。祝你好运。谢谢。这种方法更难,但更安全,更不容易被黑客攻击。