Laden...

Code zur Laufzeit kompilieren?

Erstellt von manni1238 vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.917 Views
M
manni1238 Themenstarter:in
41 Beiträge seit 2010
vor 13 Jahren
Code zur Laufzeit kompilieren?

Hallo,
Ich wollte einmal fragen, wie ich Code zur Laufzeit meines Programms in eine .exe Datei kompilieren kann. Also ich habe eine Klasse als string und möchte diese nun in eine ausführbare Datei mit meinem Programm kompilieren (Ausgabeort: Desktop).
Kann mir jemand bei meinem Problem helfen?

6.911 Beiträge seit 2009
vor 13 Jahren

Hallo,

so wie deine Frage gestellt ist hindert dich ja nichts daran eine *.cs-Datei zu erstellen und mit der Process-Klasse den C#-Compiler der Bestandteil von .net ist aufzurufen (csc.exe).

Sonst wäre für diese Aufgaben CodeDOM ein Stichwort für die Suche.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

M
manni1238 Themenstarter:in
41 Beiträge seit 2010
vor 13 Jahren

Von CodeDom habe ich schonmal ein Beispiel genutzt:


public void Compile(string code)
{
string[] namespaces = {"System", "System.Collections.Generic", "System.Linq", "System.Text", "System.Windows.Forms"};
            CompilerParameters compilerParams = new CompilerParameters(namespaces);
            compilerParams.GenerateExecutable = true;
            compilerParams.GenerateInMemory = false;
            compilerParams.OutputAssembly = @"C:\Users\Manni\Desktop\TextCompile.exe";
            compilerParams.IncludeDebugInformation = true;
            compilerParams.ReferencedAssemblies.Add("system.dll");
           
                CompilerResults result = compiler.CompileAssemblyFromSource(compilerParams, code);
                System.Windows.Forms.MessageBox.Show(result.Errors + "\n" + "Compiling beendet", "Fertig");
}

aber das scheint irgendwie nicht zu funktionieren. Der Code scheint zwar kompiliert zu werden, es erscheint aber keine Datei. Woran kann das liegen?

795 Beiträge seit 2006
vor 13 Jahren
string[] namespaces = {"System", "System.Collections.Generic", "System.Linq", "System.Text", "System.Windows.Forms"};  
            CompilerParameters compilerParams = new CompilerParameters(namespaces);  

Das, was du übergibst sind nicht die Namespaces, sonder die zu referenzierenden Assemblies. und System.Collections.Generic ist kein eigenständiges Assembly, sondern in System mit enthalten (System.Text ebenso). (Siehe hier)

Gruß, Christian.

`There are 10 types of people in the world: Those, who think they understand the binary system Those who don't even have heard about it And those who understand "Every base is base 10"`
M
manni1238 Themenstarter:in
41 Beiträge seit 2010
vor 13 Jahren

Ok, muss ich also die namespaces aus meinem Code angeben?

Wenn ja erhalte ich trotzdem noch keine .exe.

795 Beiträge seit 2006
vor 13 Jahren

Ok, muss ich also die namespaces aus meinem Code angeben?

Nein. Du musst schon die Assemblies übergeben. Aber du übergibst Namespaces.

Wenn ja erhalte ich trotzdem noch keine .exe.

Lass dir doch mal die Compiler-Errors ausgeben.

Habs gerade mal ausprobiert (einfach als Konsolenanwendung kompilieren):

using System;
using System.Collections.Generic;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.Diagnostics;

public class Program
{
    public static void Main()
    {
        Compile(@"
using System;

class Program {
    static void Main() {
        Console.WriteLine(""Hello, World"");
        Console.ReadKey(true);
    }
}
");
        Process.Start("TestCompile.exe");
    }

    public static void Compile(string code)
    {
        CSharpCodeProvider provider = new CSharpCodeProvider();
        ICodeCompiler compiler = provider.CreateCompiler();

        CompilerParameters compilerParams = new CompilerParameters();
        compilerParams.GenerateExecutable = true;
        compilerParams.GenerateInMemory = false;
        compilerParams.OutputAssembly = "TestCompile.exe";
        compilerParams.IncludeDebugInformation = true;
        compilerParams.ReferencedAssemblies.Add("system.dll");
        compilerParams.ReferencedAssemblies.Add("system.windows.forms.dll");

        CompilerResults result = compiler.CompileAssemblyFromSource(compilerParams, code);
        foreach (var error in result.Errors)
            Console.WriteLine(error);
    }
}

Funktioniert einwandfrei.

Gruß, Christian.

`There are 10 types of people in the world: Those, who think they understand the binary system Those who don't even have heard about it And those who understand "Every base is base 10"`