CSharpCodeProvider-Kompilierungsleistung
-
08-06-2019 - |
Frage
Ist CompileAssemblyFromDom schneller als CompileAssemblyFromSource?
Es sollen sein, da es vermutlich das Compiler-Frontend umgeht.
Lösung
CompileAssemblyFromDom kompiliert in eine CS-Datei, die dann über den normalen C#-Compiler ausgeführt wird.
Beispiel:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.CSharp;
using System.CodeDom;
using System.IO;
using System.CodeDom.Compiler;
using System.Reflection;
namespace CodeDomQuestion
{
class Program
{
private static void Main(string[] args)
{
Program p = new Program();
p.dotest("C:\\fs.exe");
}
public void dotest(string outputname)
{
CSharpCodeProvider cscProvider = new CSharpCodeProvider();
CompilerParameters cp = new CompilerParameters();
cp.MainClass = null;
cp.GenerateExecutable = true;
cp.OutputAssembly = outputname;
CodeNamespace ns = new CodeNamespace("StackOverflowd");
CodeTypeDeclaration type = new CodeTypeDeclaration();
type.IsClass = true;
type.Name = "MainClass";
type.TypeAttributes = TypeAttributes.Public;
ns.Types.Add(type);
CodeMemberMethod cmm = new CodeMemberMethod();
cmm.Attributes = MemberAttributes.Static;
cmm.Name = "Main";
cmm.Statements.Add(new CodeSnippetExpression("System.Console.WriteLine('f'zxcvv)"));
type.Members.Add(cmm);
CodeCompileUnit ccu = new CodeCompileUnit();
ccu.Namespaces.Add(ns);
CompilerResults results = cscProvider.CompileAssemblyFromDom(cp, ccu);
foreach (CompilerError err in results.Errors)
Console.WriteLine(err.ErrorText + " - " + err.FileName + ":" + err.Line);
Console.WriteLine();
}
}
}
was Fehler in einer (jetzt nicht vorhandenen) temporären Datei zeigt:
) erwartet – c:\Dokumente und Einstellungen\jacob\Lokale Einstellungen emp\x59n9yb-.0.cs:17
;erwartet – c:\Dokumente und Einstellungen\jacob\Lokale Einstellungen emp\x59n9yb-.0.cs:17
Ungültiger Ausdrucksbegriff „)“ – c:\Dokumente und Einstellungen\jacob\Lokale Einstellungen em p\x59n9yb-.0.cs:17
Ich schätze, die Antwort ist „Nein“.
Andere Tipps
Ich habe vorhin versucht, den ultimativen Compiler-Aufruf zu finden, aber ich habe aufgegeben.Für meine Geduld gibt es eine ganze Reihe von Schnittstellenebenen und virtuellen Klassen.
Ich glaube nicht, dass der Quellcode-Reader-Teil des Compilers zu einem DOM-Baum führt, aber intuitiv würde ich Ihnen zustimmen.Der Arbeitsaufwand für die Umwandlung des DOM in IL sollte viel geringer sein als das Lesen von C#-Quellcode.