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?
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!"
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?
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.
Ok, muss ich also die namespaces aus meinem Code angeben?
Wenn ja erhalte ich trotzdem noch keine .exe.
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.