Laden...

CodeDom: Inhalt von Variablen aus Hostprogramm im zu compilierenden Source Code verwenden!

Erstellt von R3alAvenger vor 10 Jahren Letzter Beitrag vor 10 Jahren 2.945 Views
Thema geschlossen
R
R3alAvenger Themenstarter:in
22 Beiträge seit 2013
vor 10 Jahren
CodeDom: Inhalt von Variablen aus Hostprogramm im zu compilierenden Source Code verwenden!

Hallo Leute,ich bins schon wieder -___-

Ich habe folgendes Problem : Ich habe einen Builder (GUI) programmiert. Dort sind 3 Textboxen und ein Button drauf. Wenn man auf den Button drückt, wird der Source code in eine exe compiliert. Dieser Source Code soll meinen Bilder Ordner auf einen FTP-Server hochladen. Nun möchte ich, dass ich meine FTP-Daten in diese 3 Textboxen auf der Builder Form eingeben kann, diese sollen dann in den Source Code eingebunden werden... Genauer gesagt in diese Zeile (für den FTP-Server) :

Temp.AppendLine(@"FtpWebRequest request = FtpWebRequest.Create(textBox6.Text) as FtpWebRequest;");

Wenn ich das ganze so mache, kriege ich beim compilieren eine Error von wegen textBox6 existiert nicht.

Wie kann ich das ganze umgestalten?

Lg
Der R3alAvenger (schon wieder)...

771 Beiträge seit 2009
vor 10 Jahren

Hi, meinst du


Temp.AppendLine(@"FtpWebRequest request = FtpWebRequest.Create(" + textBox6.Text + ") as FtpWebRequest;");

??? Die TextBox ist doch in deinem Programm und nicht im zu kompilierenden Source!

R
R3alAvenger Themenstarter:in
22 Beiträge seit 2013
vor 10 Jahren

Also ich habe einen Builder (eine GUI,Form). Diese beinhaltet 3 Textboxen,jeweils für Server,Name und Passwort. Ich möchte dass ich in diese 3 Textboxen meinen FTP-Server,Namen und Passwort eingeben kann. Diese sollen dann in den zu compilieren source code eingebunden werden (siehe code oben,damit die Request an den FTP-Server gesendet wird der in der Textbox steht)...
Es ist bisschen schwer zu erklären^^

Wenn ich es so mache wie du es sagst kriege ich folgenden Error :

R
R3alAvenger Themenstarter:in
22 Beiträge seit 2013
vor 10 Jahren

Nochmal hier meine Textboxen aus meinem .exe "Bauer" :

771 Beiträge seit 2009
vor 10 Jahren

Sorry, hatte die Anführungsstriche oben vergessen:


Temp.AppendLine("FtpWebRequest request = FtpWebRequest.Create(\"" + textBox6.Text + "\") as FtpWebRequest;");

Beachte den Backslash als Escapezeichen (und dafür dann @ entfernt).

R
R3alAvenger Themenstarter:in
22 Beiträge seit 2013
vor 10 Jahren

Ich habe eben in meinem Post noch ein Bild hinzugefügt wo ich einen Error durch deine gesagte Methode bekomme 😕

771 Beiträge seit 2009
vor 10 Jahren

Sorry, da haben wir wohl beide gleichzeitig editiert.

R
R3alAvenger Themenstarter:in
22 Beiträge seit 2013
vor 10 Jahren

Ich kriege immernoch den selben Error....
Schau mal hier mein kompletter code :

        private void button2_Click(object sender, EventArgs e)
        {
            SaveFileDialog d = new SaveFileDialog();
            d.Filter = "Executable (*.exe)|*.exe";
            if (d.ShowDialog() == DialogResult.OK)
            {
                string source = Properties.Resources.source;
                CompilerParameters param = new CompilerParameters();
                param.CompilerOptions += "/target:winexe" + " " + "/win32icon:" + "\"" + textBox1.Text + "\"";
                param.GenerateExecutable = true;
                param.ReferencedAssemblies.Add("System.Windows.Forms.dll");
                param.ReferencedAssemblies.Add("System.dll");
                param.OutputAssembly = d.FileName;

                string name;
                name = "C:\\Users\\BT\\Desktop";

                StringBuilder Temp = new StringBuilder();
                String InputCode = String.Empty;
                InputCode = "";
                Temp.AppendLine(@"using System;");
                Temp.AppendLine(@"using System.Windows.Forms;");
                Temp.AppendLine(@"using System.Net;");
                Temp.AppendLine(@"using System.IO;");
                Temp.AppendLine(@"namespace RunTimeCompiler{");
                Temp.AppendLine(@"public class Test{");
                Temp.AppendLine(@"static void Main(string[] args){");
                Temp.AppendLine("FtpWebRequest request = FtpWebRequest.Create(\"" + textBox6.Text + "\") as FtpWebRequest;");
                Temp.AppendLine(@"request.Method = WebRequestMethods.Ftp.UploadFile;");
                Temp.AppendLine(@"request.Credentials = new NetworkCredential("+textBox7.Text+","+textBox8.Text+");");
                Temp.AppendLine(@"request.UsePassive = true;");
                Temp.AppendLine(@"request.KeepAlive = false;");
                Temp.AppendLine(@"FileStream stream = File.OpenRead(@name);");
                Temp.AppendLine(@"byte[] buffer = new byte[stream.Length];");
                Temp.AppendLine(@"stream.Close();");
                Temp.AppendLine(@"Stream reqStream = request.GetRequestStream();");
                Temp.AppendLine(@"reqStream.Write(buffer,0,buffer.Length);");
                Temp.AppendLine(@"reqStream.Close();");

                Temp.AppendLine(InputCode);
                Temp.AppendLine(@"}}}");
                CompilerResults result = new CSharpCodeProvider().CompileAssemblyFromSource(param, Temp.ToString());
                if (result.Errors.Count > 0) foreach (CompilerError err in result.Errors) MessageBox.Show(err.ToString());
                else MessageBox.Show("Done.");
            }
771 Beiträge seit 2009
vor 10 Jahren

Bei deinen anderen beiden TextBoxen (sowie der Variablen 'name') mußt du das natürlich auch so abändern.
Und kapsel den CodeDom-Code in eine eigene Methode (anstatt direkt im Button-Click) und benenne deine GUI-Elemente (TextBoxen etc.) besser.

Aber mal ein anderer Tipp:
Viel einfacher könntest du es dir machen, wenn du den Source-Code als (Resource-)Datei hältst und einliest und dann vor dem Kompilieren z.B. mittels Ersetzen von "%FTP_SERVER%" etc. die TextBox-Werte dort einträgst.


string code = File.ReadAllText("SourceCode.template"); // oder als Resource, z.B.  Properties.Resources.SourceCode
code = code.Replace("%FTP_SERVER%", textboxFtpServer.Text);
// und die anderen auch noch ersetzen

R
R3alAvenger Themenstarter:in
22 Beiträge seit 2013
vor 10 Jahren

Jetzt siehts so aus und ich kriege nur noch zwei error nachrichten :
<siehe Anhang>

private void button2_Click(object sender, EventArgs e)
        {
            SaveFileDialog d = new SaveFileDialog();
            d.Filter = "Executable (*.exe)|*.exe";
            if (d.ShowDialog() == DialogResult.OK)
            {
                string source = Properties.Resources.source;
                CompilerParameters param = new CompilerParameters();
                param.CompilerOptions += "/target:winexe" + " " + "/win32icon:" + "\"" + textBox1.Text + "\"";
                param.GenerateExecutable = true;
                param.ReferencedAssemblies.Add("System.Windows.Forms.dll");
                param.ReferencedAssemblies.Add("System.dll");
                param.OutputAssembly = d.FileName;

                string name;
                name = "C:\\Users\\BT\\Desktop";

                StringBuilder Temp = new StringBuilder();
                String InputCode = String.Empty;
                InputCode = "";
                Temp.AppendLine(@"using System;");
                Temp.AppendLine(@"using System.Windows.Forms;");
                Temp.AppendLine(@"using System.Net;");
                Temp.AppendLine(@"using System.IO;");
                Temp.AppendLine(@"namespace RunTimeCompiler{");
                Temp.AppendLine(@"public class Test{");
                Temp.AppendLine(@"static void Main(string[] args){");
                Temp.AppendLine("FtpWebRequest request = FtpWebRequest.Create(\"" + textBox6.Text + "\") as FtpWebRequest;");
                Temp.AppendLine(@"request.Method = WebRequestMethods.Ftp.UploadFile;");
                Temp.AppendLine("request.Credentials = new NetworkCredential(\"" + textBox7.Text + "," + textBox8.Text + "\");");
                Temp.AppendLine(@"request.UsePassive = true;");
                Temp.AppendLine(@"request.KeepAlive = false;");
                Temp.AppendLine("FileStream stream = File.OpenRead(@name);");
                Temp.AppendLine(@"byte[] buffer = new byte[stream.Length];");
                Temp.AppendLine(@"stream.Close();");
                Temp.AppendLine(@"Stream reqStream = request.GetRequestStream();");
                Temp.AppendLine(@"reqStream.Write(buffer,0,buffer.Length);");
                Temp.AppendLine(@"reqStream.Close();");

                Temp.AppendLine(InputCode);
                Temp.AppendLine(@"}}}");
                CompilerResults result = new CSharpCodeProvider().CompileAssemblyFromSource(param, Temp.ToString());
                if (result.Errors.Count > 0) foreach (CompilerError err in result.Errors) MessageBox.Show(err.ToString());
                else MessageBox.Show("Done.");
            }
        }

R
R3alAvenger Themenstarter:in
22 Beiträge seit 2013
vor 10 Jahren
771 Beiträge seit 2009
vor 10 Jahren

Ich habe oben noch mal nacheditiert (der Thread ist wahrscheinlich jetzt nicht mehr ganz einfach nachzuvollziehen?).

Noch ein Edit:
ich sehe gerade, daß du ja schon mittels


string source = Properties.Resources.source;

den Source-Code einbindest (aber bisher nicht benutzt). Dann kannst du ja meinen Tipp direkt befolgen.

R
R3alAvenger Themenstarter:in
22 Beiträge seit 2013
vor 10 Jahren

Ok ich werde es jetzt mal komplett umbasteln und deine methode mit der ressource versuchen!
Vielen dank!

Hinweis von herbivore vor 10 Jahren

Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 1.1.1, 1.1 und [Hinweis] Syntaxfehler selbst lösen (Compilerfehlermeldungen).

Immer nur die Fehlermeldungen und den Code posten, ist nicht die feine Art. Bitte macht das nicht noch mal. Siehe dazu Punkt 4.

Hänge außerdem Bilder immer als Dateianhang an und lege sie nicht auf externe Hoster, siehe Punkt 6.1. => korrigiert

Wenn die Bilder Fehlermeldungen enthalten, dann poste deren Text besser direkt im Beitrag, dann kann er auch über die Suche gefunden werden, siehe Punkt 5 und [Tipp] Strg-C kopiert MessageBox-Inhalt.

Thema geschlossen