Home » Questions » Computers [ Ask a new question ]

CSharpCodeProvider Compilation Performance

CSharpCodeProvider Compilation Performance

"Is CompileAssemblyFromDom faster than CompileAssemblyFromSource?

It should be as it presumably bypasses the compiler front-end."

Asked by: Guest | Views: 237
Total answers/comments: 2
Guest [Entry]

"CompileAssemblyFromDom compiles to a .cs file which is then run through the normal C# compiler.
Example:
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();
}
}
}

which shows errors in a (now nonexistent) temp file:

) expected - c:\Documents and Settings\jacob\Local Settings\Temp\x59n9yb-.0.cs:17
; expected - c:\Documents and Settings\jacob\Local Settings\Temp\x59n9yb-.0.cs:17
Invalid expression term ')' - c:\Documents and Settings\jacob\Local Settings\Tem p\x59n9yb-.0.cs:17

So I guess the answer is ""no"""
Guest [Entry]

"I've tried finding the ultimate compiler call earlier and I gave up. There's quite a number of layers of interfaces and virtual classes for my patience.

I don't think the source reader part of the compiler ends up with a DOM tree, but intuitively I would agree with you. The work necessary to transform the DOM to IL should be much less than reading C# source code."