使用C#动态代码访问WinForm控件

时间:2015-01-30 14:59:21

标签: c# .net winforms dynamic codedom

我有WinForm,名为Form1,还有Button1,MemoEdit1和2个名为TextBox1TextBox2的文本框。在运行时,用户应该能够在MemoEdit1中编写C#代码,以便操作TextBox控件。 F.e:在运行时用户输入MemoEdit1简单代码,如:TextBox2.Text =" Hello" + TextBox1.Text;

因此,当我点击Button1时,我需要编译并执行代码。

问题听起来可能很简单,因为我是C#运行时编译/执行代码的新手。

你能帮忙吗?

感谢。

1 个答案:

答案 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调用它,你可能必须将你自己的程序集引用到这个程序集中