CSharpCodeProvider Компиляция Performance

голоса
16

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

Это должно быть , как он предположительно обходит компилятор переднего плана.

Задан 07/08/2008 в 13:01
источник пользователем
На других языках...                            


2 ответов

голоса
7

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 и Settings \ Яаков \ Local Settings \ Temp \ x59n9yb-.0.cs: 17

; ожидается - C: \ Documents и Settings \ Яаков \ Local Settings \ Temp \ x59n9yb-.0.cs: 17

Термин Недопустимое выражение ')' - C: \ Documents и Settings \ Яаков \ Local Settings \ Tem р \ x59n9yb-.0.cs: 17

Таким образом, я предполагаю, что ответ «нет»

Ответил 27/08/2008 в 02:03
источник пользователем

голоса
0

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

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

Ответил 07/08/2008 в 13:48
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more