2010-04-24 5 views
3

Je tente de compiler du code dans un fichier texte pour modifier une valeur dans un TextBox sur le formulaire principal d'une application WinForms. C'est à dire. ajouter une autre classe partielle avec la méthode au formulaire appelant. Le formulaire a un bouton (button1) et un TextBox (textBox1).CodeDom: compilez la classe partielle

Le code dans le fichier texte est:

this.textBox1.Text = "Bonjour tout le monde !!";

Et le code:

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); 
      } 


     } 
    } 
} 

Quand je compile le code, le CompilerResults renvoie une erreur qui dit WinFormCodeCompile.Form1 ne contient pas de définition pour textBox1.

Existe-t-il un moyen de créer dynamiquement un autre fichier de classe partielle à l'assembly appelant et d'exécuter ce code?

Je suppose qu'il me manque quelque chose de vraiment simple ici.

+0

essayez-vous d'accomplir ce que le code compilé à partir du code.txt sera "ajouté" à l'application en cours d'exécution? – Axarydax

+0

@Axarydax - Oui, mais seulement temporaire. Juste voir s'il était possible de mettre à jour un petit fragment de code dans un fichier texte et de l'utiliser lors de l'exécution. – Inisheer

Répondre

5

Les classes partielles ne peuvent pas s'étendre sur des assemblages - l'assemblage est l'unité de compilation et les classes partielles deviennent une seule classe une fois compilées (il n'y a pas de concept équivalent au niveau CLR).

1

Vous pouvez essayer d'utiliser des paramètres pour passer l'objet que vous souhaitez manipuler, comme:

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

donc de cette façon l'extrait résulterait que:

(passBox as TextBox).Text = "Hello World!!"; 
Questions connexes