我有WinForm,名为Form1,还有Button1,MemoEdit1和2个名为TextBox1
和TextBox2
的文本框。在运行时,用户应该能够在MemoEdit1中编写C#代码,以便操作TextBox控件。 F.e:在运行时用户输入MemoEdit1简单代码,如:TextBox2.Text =" Hello" + TextBox1.Text;
因此,当我点击Button1时,我需要编译并执行代码。
问题听起来可能很简单,因为我是C#运行时编译/执行代码的新手。
你能帮忙吗?
感谢。
答案 0 :(得分:0)
看一下这个片段
public class Evaluator
{
public void Eval(string Code)
{
Microsoft.CSharp.CSharpCodeProvider Provider = new Microsoft.CSharp.CSharpCodeProvider(); // Create an provider
System.CodeDom.Compiler.ICodeCompiler Compiler = Provider.CreateCompiler(); // Create An Compiler
System.CodeDom.Compiler.CompilerParameters Parameters = new System.CodeDom.Compiler.CompilerParameters(); // Create a parameters of the compiler
Parameters.GenerateInMemory = true; // It should generate the compiled assembly in the memory
System.CodeDom.Compiler.CompilerResults Results = Compiler.CompileAssemblyFromSource(Parameters, Code); //Compile it
///Now you just need to use reflection to call its methods
object SomeClass = Results.CompiledAssembly.CreateInstance("ClassName"); //Name of the class you want to create an instance
var Method = SomeClass.GetType().GetMethod("MethodName"); //Name of the Method you want to call
Method.Invoke(SomeClass, null); // change null for the argument it needs
}
}
如果你只想编写代码,你必须添加一个类和一个方法来包装用户代码,然后通过Invoke调用它,你可能必须将你自己的程序集引用到这个程序集中