将用户输入作为字符串并将其转换为可执行代码C#
嗨,我是C#的新手,我正在尝试创建一个应用程序,它接受用户输入并将其转换为代码,然后运行它。我遵循了一些指南,但每次都会遇到同样的错误。我正在使用Microsoft.Csharp和system.codedom。有没有其他方法可以做到这一点,或者有人可以帮我解决这个错误。这段代码是我的unity游戏的一部分,放在我的一个脚本中 程序集“System.CodeDom”中类型“Microsoft.CSharp.CSharpCodeProvider”的类型转发器会导致一个循环,我一直都会收到此错误。我能找到的所有例子都非常古老,它们都会导致相同的错误。我在microsoft.codedom.providers.dotnetcompilerplatform中遇到了相同的错误将用户输入作为字符串并将其转换为可执行代码C#,c#,unity3d,C#,Unity3d,嗨,我是C#的新手,我正在尝试创建一个应用程序,它接受用户输入并将其转换为代码,然后运行它。我遵循了一些指南,但每次都会遇到同样的错误。我正在使用Microsoft.Csharp和system.codedom。有没有其他方法可以做到这一点,或者有人可以帮我解决这个错误。这段代码是我的unity游戏的一部分,放在我的一个脚本中 程序集“System.CodeDom”中类型“Microsoft.CSharp.CSharpCodeProvider”的类型转发器会导致一个循环,我一直都会收到此错误。我能
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和定制的简单“脚本语言”,然后在游戏引擎中解析为动作 您可以从以下形式的教程级别开始:
Do(10)
{
Move(0, +1);
}
一旦玩家“运行”代码,他就会看到黄色方块向上移动“10个单位”
为了便于查看,您可以在每次“执行”循环之间暂停片刻,以便注意每次循环重复中发生的情况。C#并不是真正意义上的脚本语言。Unity应用程序通常使用Lua编写脚本。不确定这是否是问题所在,但
返回{0}你能解释一下为什么你想让用户动态编译C代码,而不是让他们使用Visual Studio IDE吗?您正在尝试编写应用程序脚本吗?可能有比使用CodeDOM动态编译代码更好的方法来实现您的目标(从安全角度来看,这可能是危险的)。这是一款旨在教授人们基本编码的游戏,意味着他们可以按下一些按钮,游戏中的角色会遵循这些命令。按钮将这些命令保存为字符串并在终端中显示,然后用户可以按另一个按钮运行这些命令。所有的命令都保存为字符串。你对内容的值使用了什么?是的,我的游戏有一个终端和一些按钮,在终端中添加了一些预定义的代码,我决定用一种完全不同的方式解决这个问题。我将手动读取输入字符串,并在字符串中使用这些预定义的方法,并执行与这些字符串相关的一些函数。我最初的想法是直接将输入字符串转换成C代码,但这有点冒险,我无法让它工作。是的,这正是我的想法和建议。我相信这是创建游戏的有效方法。你最初的想法中充斥着一定会爆炸的东西。我会祈祷的。祝你好运。谢谢。这种方法更难,但更安全,更不容易被黑客攻击。