Question

Est CompileAssemblyFromDom plus rapide que CompileAssemblyFromSource?

Il devrait être car il contourne vraisemblablement le front-end du compilateur.

Était-ce utile?

La solution

CompileAssemblyFromDom compile dans un fichier .cs qui est ensuite exécuté via le compilateur C# normal.

Exemple:

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();
        }
    }
}

qui montre des erreurs dans un fichier temporaire (maintenant inexistant) :

) attendu - c:\Documents and Settings\jacob\Local Settings emp\x59n9yb-.0.cs:17

;attendu - c:\Documents and Settings\jacob\Local Settings emp\x59n9yb-.0.cs:17

Terme d'expression non valide ')' - c:\Documents and Settings\jacob\Local Settings em p\x59n9yb-.0.cs:17

Donc je suppose que la réponse est "non"

Autres conseils

J'ai essayé de trouver l'appel ultime du compilateur plus tôt et j'ai abandonné.Il existe un certain nombre de couches d'interfaces et de classes virtuelles pour ma patience.

Je ne pense pas que la partie lecteur de source du compilateur se termine par une arborescence DOM, mais intuitivement, je serais d'accord avec vous.Le travail nécessaire pour transformer le DOM en IL devrait être bien moindre que la lecture du code source C#.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top