代码之家  ›  专栏  ›  技术社区  ›  Andrew Peters

CSharpCodeProvider编译性能

  •  16
  • Andrew Peters  · 技术社区  · 17 年前

    编译SemblyFromDom 比快 从源代码编译序列号 ?

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

    2 回复  |  直到 10 年前
        1
  •  7
  •   Markus Safar    10 年前

    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

    所以我想答案是“不”

        2
  •  0
  •   Lasse V. Karlsen    17 年前

    我之前试过找到终极编译器调用,但我放弃了。有相当多的界面层和虚拟类需要我的耐心。

    我不认为编译器的源代码阅读器部分最终会得到一个DOM树,但是直觉上我同意你的观点。将DOM转换为IL所需的工作应该比读取C源代码少得多。