CSharpCodeProvider编译性能

CompileAssemblyFromDomCompileAssemblyFromSource 快吗?

它应该,因为它可能会绕过编译器前端。

0

2 答案

我试过早些时候发现最终的编译器调用,我放弃了。为了我的耐心,有相当多的接口层和虚拟类。

我不认为编译器的源代码阅读器部分以DOM树为结束,但直观上我会同意你的看法。将DOM转换为IL所需的工作应该远远小于阅读C#源代码。

0
额外

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 \ Local Settings \ Temp \ x59n9yb-.0.cs:17

     

预期 - c:\ Documents and Settings \ jacob \ Local Settings \ Temp \ x59n9yb-.0.cs:17

     

无效的表达术语')' - c:\ Documents and Settings \ jacob \ Local Settings \ Tem p \ x59n9yb-.0.cs:17

所以我想答案是“不”

0
额外
绝对正确,尽管令人失望。 CodeDOM被转换成C#文本,保存到临时文件,然后调用C#编译器(用C ++开发)。我不知道Mono是否是这种情况,但不幸的是,CodeDOM实际上比直接编写C#要慢。
额外 作者 David Pfeffer,
假设csc.exe正在C#中重写,所以将来可能会有一种管理方式让您直接将AST传递给编译器。但是,正如.NET 3.5所示,除了自己发布IL程序集或字节码之外,目前还没有办法绕过编译器前端。
额外 作者 Jacob Krall,