winform的动态代码编译在C#中给出错误

时间:2014-09-25 09:32:41

标签: c# .net winforms dynamic-compilation

我有简单的Windows应用程序,其中创建动态Win窗体并与工具箱一起显示。 用户拖动并删除此动态创建的表单上的控件,并相应地编写代码。 下面不是整个代码,而是我面临问题的一​​块。我正在尝试编译用户在运行时编写的代码,但它给出了错误“在表单0 - >名称'InitializeComponent'在当前上下文中不存在行(12)错误:CS0103”

            // small piece of code
            string SecondLine = @"public partial class Form1 : Form
                                   {
                                      public Form1()
                                      {
                                         InitializeComponent();
                                      }
                                   }";


            Form1 frm =new Form1();

        frm.textBox1.Text = "using System;" + Environment.NewLine
        + "using System.IO;" + Environment.NewLine + "using System.Drawing;" +                    Environment.NewLine + "using System.Windows.Forms;" + Environment.NewLine + Environment.NewLine + "namespace MiniCompiler{" + Environment.NewLine + Environment.NewLine;

            frm.textBox1.Text = frm.textBox1.Text + SecondLine.ToString();
            frm.textBox1.Text = frm.textBox1.Text + Environment.NewLine + Environment.NewLine + "static class Program{" + Environment.NewLine + " [STAThread] " + Environment.NewLine + "static void Main()" + "{" + Environment.NewLine;


            string firstLine = "Application.EnableVisualStyles(); " + Environment.NewLine + "Application.SetCompatibleTextRenderingDefault(false);" + Environment.NewLine + "Application.Run(new Form1());";

            frm.textBox1.Text = frm.textBox1.Text + Environment.NewLine + firstLine;   
            frm.textBox1.Text = frm.textBox1.Text.ToString() + Environment.NewLine + "}" ;

//编译代码

 CSharpCodeProvider provider = new CSharpCodeProvider();
 ICodeCompiler compiler = provider.CreateCompiler();
 CompilerResults result = compiler.CompileAssemblyFromSource(param,code); 

我真的不确定在这里编译Winform会出现什么问题。

谢谢,

1 个答案:

答案 0 :(得分:1)

我认为错误信息是正确的。我无法看到在Form1-Class的构造函数中调用InitializeComponent() - Method的位置。

因为Form是作为一个部分类生成的,所以可能有(并且实际上默认情况下)有多个文件,其中包含该类的成员。默认情况下,您有两个文件。在你的情况下Form1.cs和Form1.Designer.cs。两者都描述了Form1类。

不继承Method InitializeComponent。它在同一个类中定义,只在另一个文件中定义。

    private void InitializeComponent()
    {
        this.components = new System.ComponentModel.Container();
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.Text = "Form1";
    }

您可以将此方法从Form1-Class的其他部分部分复制到SecondLine-String中。那我觉得它应该有效。

Look in this file