Производительность компиляции CSharpCodeProvider

Является ли CompileAssemblyFromDom быстрее, чем CompileAssemblyFromSource ?

Это должно быть так, как будто он обходит внешний интерфейс компилятора.

7.08.2008 12:01:14
2 ОТВЕТА
РЕШЕНИЕ

CompileAssemblyFromDom компилируется в файл .cs, который затем запускается через обычный компилятор C #.

Пример:

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

который показывает ошибки в (теперь несуществующем) временном файле:

) ожидается - c: \ Documents and Settings \ jacob \ Локальные настройки \ Temp \ x59n9yb-.0.cs: 17

; ожидается - c: \ Documents and Settings \ jacob \ Локальные настройки \ Temp \ x59n9yb-.0.cs: 17

Недопустимый термин выражения ')' - c: \ Documents and Settings \ jacob \ Локальные настройки \ Tem p \ x59n9yb-.0.cs: 17

Так что я думаю, что ответ "нет"

9
7.02.2016 14:29:25
Абсолютно правильно, хотя и разочаровывает. CodeDOM преобразуется в текст C #, сохраняется во временный файл, а затем вызывается компилятор C # (разработанный на C ++). Я не знаю, так ли это для Mono, но, к сожалению, CodeDOM на самом деле медленнее, чем прямая запись на C #.
David Pfeffer 20.11.2009 16:15:12
Предположительно, csc.exe переписывается на C #, поэтому в будущем может существовать управляемый способ, позволяющий передавать AST непосредственно компилятору. Однако, поскольку сейчас стоит .NET 3.5, в настоящее время нет никакого способа обойти внешний интерфейс компилятора, кроме как генерировать сборку IL или сам байт-код.
Jacob Krall 21.11.2009 00:32:10

Я попытался найти окончательный вызов компилятора ранее, и я сдался. Для моего терпения существует довольно много уровней интерфейсов и виртуальных классов.

Я не думаю, что часть читателя исходного кода компилятора заканчивается деревом DOM, но интуитивно я бы согласился с вами. Работы, необходимые для преобразования DOM в IL, должны быть намного меньше, чем чтение исходного кода C #.

0
7.08.2008 12:48:29