2010-04-24 6 views
3

Я пытаюсь скомпилировать код в текстовом файле, чтобы изменить значение в TextBox в основной форме приложения WinForms. То есть. добавьте еще один частичный класс с методом в вызывающую форму. Форма имеет одну кнопку (button1) и один TextBox (textBox1).CodeDom: скомпилировать частичный класс

код в текстовом файле:

this.textBox1.Text = "Hello World !!";

И код:

namespace WinFormCodeCompile 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      // Load code from file 
      StreamReader sReader = new StreamReader(@"Code.txt"); 
      string input = sReader.ReadToEnd(); 
      sReader.Close(); 

      // Code literal 
      string code = 
       @"using System; 
        using System.Windows.Forms; 

        namespace WinFormCodeCompile 
        { 
         public partial class Form1 : Form 
         { 

          public void UpdateText() 
          {" + input + @" 
          } 
         } 
        }"; 

      // Compile code 
      CSharpCodeProvider cProv = new CSharpCodeProvider(); 
      CompilerParameters cParams = new CompilerParameters(); 
      cParams.ReferencedAssemblies.Add("mscorlib.dll"); 
      cParams.ReferencedAssemblies.Add("System.dll"); 
      cParams.ReferencedAssemblies.Add("System.Windows.Forms.dll"); 
      cParams.GenerateExecutable = false; 
      cParams.GenerateInMemory = true; 

      CompilerResults cResults = cProv.CompileAssemblyFromSource(cParams, code); 

      // Check for errors 
      if (cResults.Errors.Count != 0) 
      { 
       foreach (var er in cResults.Errors) 
       { 
        MessageBox.Show(er.ToString()); 
       } 
      } 
      else 
      { 
       // Attempt to execute method. 
       object obj = cResults.CompiledAssembly.CreateInstance("WinFormCodeCompile.Form1"); 
       Type t = obj.GetType(); 
       t.InvokeMember("UpdateText", BindingFlags.InvokeMethod, null, obj, null); 
      } 


     } 
    } 
} 

Когда я компиляции кода, CompilerResults возвращает ошибку, которая говорит WinFormCodeCompile.Form1 не содержит определения для textBox1.

Есть ли способ динамически создать другой частичный файл класса для вызывающей сборки и выполнить этот код?

Я предполагаю, что мне не хватает чего-то действительно простого здесь.

+0

вы пытаетесь достичь этого кода скомпилированный из code.txt, будет «добавлен» к исполняющему приложению? – Axarydax

+0

@Axarydax - Да, но только временно. Просто посмотрел, можно ли обновить небольшой фрагмент кода в текстовом файле и использовать его во время выполнения. – Inisheer

ответ

5

Частичные классы не могут охватывать сборки - сборка является единицей компиляции, а частичные классы становятся единым классом после компиляции (на уровне CLR нет эквивалентной концепции).

1

Вы можете попробовать использовать параметры передать объект, который вы хотите управлять, как:

// etc 
public void UpdateText(object passBox) 
{" + input + @" } 
// more etc 
t.InvokeMember("UpdateText", BindingFlags.InvokeMethod, null, obj, new object[] { this.textbox }); 

Так таким образом фрагмент кода приведет как:

(passBox as TextBox).Text = "Hello World!!"; 
Смежные вопросы