2014-09-25 46 views
3

我有一個簡單的Windows應用程序,其中一個動態的Win窗體被創建並與工具箱一起顯示。 用戶在這個動態創建的表單上拖放控件並相應地寫入代碼。 下面是不是完整的代碼,但我面臨的問題片。我試圖編譯在運行時由用戶編寫的代碼,但它給了我錯誤「在表格0 - >‘的InitializeComponent’不存在於當前上下文線路存在的名稱(12)錯誤:CS0103」Winform的動態代碼編譯給C#中的錯誤#

  // 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

你是否包含聲明InitializeComponent的部分? – 2014-09-25 09:34:15

+0

@ Selman22 - 不..但Form1是dyamically生成..所以我如何包括它。 – user1291401 2014-09-25 09:35:48

+0

你把工具箱中的控件.. ..動態創建窗體。 – 2014-09-25 09:38:55

回答

1

我認爲錯誤信息是正確的。我無法看到你的InitializeComponent() - 方法,在Form1-Class的構造函數中調用的方法被定義。

由於表單是作爲部分類生成的,因此可能有(並且實際上每個默認情況下都有)多個文件,女巫包含該類的成員。默認情況下你有兩個文件。在你的情況Form1.cs和Form1.Designer.cs。兩者一起描述了Form1類。

方法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

+0

會嘗試它並更新結果.. – user1291401 2014-09-25 09:43:29

+0

它編譯成功...但又打開一個新的表單。 – user1291401 2014-09-25 10:05:32

+0

@ user1291401你想要發生什麼? – Greenhorn 2014-09-25 10:48:54