How does LINQPad compile code?

非 Y 不嫁゛ 提交于 2019-12-17 23:02:06

问题


I am guessing it neither invokes csc.exe or implement an entire compiler, so how does it work?

Update: Thanks to Jon Skeet for the pointer to code that was easy to learn from.

string c = @"
public class A
{
    public static void Main(string[] args)
    {
        System.Console.WriteLine(""hello world"");
    }
}
";

CodeDomProvider compiler = new CSharpCodeProvider();

CompilerParameters parameters = new CompilerParameters();
parameters.WarningLevel = 4;
parameters.GenerateExecutable = false;
parameters.GenerateInMemory = true;

CompilerResults r = compiler.CompileAssemblyFromSource(parameters, c);

Assembly a = r.CompiledAssembly;

Type[] ts = a.GetTypes();

Type t = ts[0];

object o = t.GetMethod("Main").Invoke(null, new object[] { new string[] { } });

回答1:


From "How LINQPad Works":

LINQPad compiles your queries using .NET's CSharpCodeProvider (or VBCodeProvider)

Obviously there's rather more to it, but that's the bit you asked about - read the link for more details.

If you want to have a look at a rather more simplistic implementation, you could download the source code for Snippy, the little tool I created for C# in Depth. Again, it uses CSharpCodeProvider - and it's a simple enough example that it's easy to understand, with any luck. (There are only a few classes involved, IIRC.)




回答2:


Jon's answer from almost 5 years ago is now out of date.

From "How LINQPad Works" (as at 29 Jan 2016):

LINQPad 5 compiles your queries using the Microsoft Roslyn libraries (in the past it used .NET's CSharpCodeProvider and VBCodeProvider).

You can see an example of how to use Roslyn to compile your code here: Learn Roslyn Now - Part 16 - The Emit API



来源:https://stackoverflow.com/questions/5766373/how-does-linqpad-compile-code

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!