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)...
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!
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 :
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).
Ich habe eben in meinem Post noch ein Bild hinzugefügt wo ich einen Error durch deine gesagte Methode bekomme 😕
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.");
}
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
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.");
}
}
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.
Ok ich werde es jetzt mal komplett umbasteln und deine methode mit der ressource versuchen!
Vielen dank!
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.