Kompilieren

die Klasse Builder sieht so aus:

Code:
class Builder
        {
            public bool Generate(out string errString)
            {
                ICodeCompiler compiler = new CSharpCodeProvider().CreateCompiler();
                CompilerParameters compArgs = new CompilerParameters();
                compArgs.GenerateExecutable = true;
                compArgs.OutputAssembly = "sample.exe";
                compArgs.CompilerOptions = "/target:winexe";

                foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies())
                    compArgs.ReferencedAssemblies.Add(asm.Location);

                CompilerResults ret = compiler.CompileAssemblyFromSource(compArgs, SourcecodeZ);

                if (ret.Errors.Count > 0)
                {
                    errString = ret.Errors[0].ToString(); // liefert den ersten Fehler zurück
                    return false; // ERROR
                }
            }

sie steht am ende der Funktion InitializeComponent

das hier:

Code:
sb.Append("using System;\r\n");
            sb.Append("using System.Windows.Forms;\r\n");
            sb.Append("public class MainClass\r\n");
            sb.Append("{\r\n");
            sb.Append("public static void Main()\r\n");
            sb.Append("{\r\n");
            sb.Append("MessageBox.Show(\"Mein Name lautet: \" + \"");
            sb.Append(Filename.Text);
            sb.Append("\", \"Generierte *.exe\", MessageBoxButtons.OK, MessageBoxIcon.Information);");
            sb.Append("}\r\n");
            sb.Append("}\r\n");

            SourcecodeZ = sb.ToString();

            Builder Builder = new Builder();
            
            if (!Builder.Generate(out error))
            {
                MessageBox.Show(error);
                return;

wird aufgerufen wenn man auf Kompilieren Klickt

Schau Dir mal unser [thread=164307]C# Kompilierung zur Laufzeit - Tutorial[/thread] an. :)

und das ist das Tutorial


achja, und ich bräuchte noch eine möglichkeit wie ich Ordner erstellen kann...
 
Zuletzt bearbeitet:
Hi

Dann solltest du nicht einfach kopieren sonder auch die Erklärungen dazu lesen.
In den Erklärungen von Cosmo steht das die einzelnen Bezeichner bedeuten (SourceCodeZ scheint übrigens ein Tippfehler zu sein, wie gesagt, lesen dann wäre dir das aufgefallen).

Und was für Ordner willst du jetzt noch erstellen? :confused:
Ordner im FileSystem? Dann bitte einfach mal selber Google und/oder die MSDN bemühen, da gibts Beispiele ohne Ende ;)
 
Ich hab das ganze schon gelesen, nur den Code halt einfach Kopiert weil ich Code immer erstmal Kopiere um zu Testen ob es so geht.

Ich bin jetzt soweit:
sb ist ein StringBuilder Objekt(hab ich wohl überlesen)
Sourcecode scheint ein string zu sein, in dem geschreibenen wurde er aber nicht Deklariert. Ich gehe mal davon aus dass ich aus
Code:
Sourcecode = sb.ToString();
Code:
string Sourcecode = sb.ToString();
machen muss.

Aber von Error hab ich in dem Tutorial nix gefunden.


Und zu dem Ordner:
Ich will halt einfach einen Ordner erstellen, im File Namespace hab ich nix gefunden, ich hab auch schon danach Gegoogelt und in der MSDN bin ich auch nicht fündig geworden.
 
Ich hab das ganze mal geändert und Kompiliert, jetzt gibt es ein weiteres Problem:

Sourcecode ist in der Klasse Builder (oder in der Funktion Generate) nicht bekannt.
 
Du bist schon mal auf die Idee gekommen, eine Variable zu übergeben bzw. sie so zu deklarieren, dass sie an entsprechender Stelle verfügbar ist?!
 
also als Parameter kann ich das nicht machen, habe ich schon ausprobiert

Ich könnte den String auch als Attribut der Klasse Builder verwenden, aber ich glaube nicht, dass das in dem Tutorial so gedacht war, weil Sourcecode verwendet wird bevor ich das Builder Objekt deklariere. Könnte natürlich auch ein Fehler (im Tutorial) sein.

Ich hab das mal als Attribut verwendet, aber jetzt stehe ich immer noch vor den Problemen:

1. Error ist nicht vorhanden

2. Builder.Generate(out string): Nicht alle Codepfade geben einen Wert zurück. (Hey, das ist neu!!)
Gut, das kann ich auch machen, ich glaube mal dass ich einfach nach dem if noch ein return true machen sollte und......Neuer Fehler: Dem out-Parameter "errString" muss etwas zugewiesen werden, bevor das Steuerelement die aktuelle Methode verlässt.
Dafür ist der alte weg.

Ich glaube das Tutorial ist etwas unvollständig....

// EDIT

Ok, das ganze hat sich erledigt:

Ich habe der Klasse Builder noch das Attribut error (string) gegeben, und errString habe ich einfach "" zugewiesen.

Ich glaube ich schreibe mal eine mail an den der das Tutorial gemacht hat, da könnte man noch einiges verbessern.

Damit hat sich das Thema erledigt, Danke!
 
Code:
if (!Builder.Generate(out error))
            {
                MessageBox.Show(error);
                return;
            }

doch, da gibts ein error.

In dem Tutorial stand halt nix davon drin dass error ebenfalls ein string sein sollte (gut, MessageBoxen geben hauptsächlich strings aus aber trotzdem), und wo es deklariert wird.
 
Hallo,
ich bin der Autor von dem Tutorial, ich hab damals eigentlich ein Link zum Download vom Sourcecode bereitgestellt, aber der taucht im Tutorial nicht mehr auf. Hier hast du den Sourcecode zu dem kompletten Projekt, wenn ich meine Abschlussprüfung hinter mir habe, werd ich das Tutorial mal überarbeiten.

Sourcecode
 
Zurück