LINQPad如何编译代码?

时间:2011-04-23 19:26:13

标签: c# linqpad

我猜它既没有调用csc.exe也没有实现整个编译器,所以它是如何工作的?

更新:感谢Jon Skeet提供了易于学习的代码指针。

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[] { } });

2 个答案:

答案 0 :(得分:29)

来自"How LINQPad Works"

  

LINQPad使用.NET的CSharpCodeProvider(或VBCodeProvider)编译您的查询

显然还有更多内容,但这就是你要问的一点 - 阅读链接了解更多细节。

如果你想看一个相当简单的实现,你可以download the source code获取Snippy,这是我在深度中为C#创建的小工具。再次,它使用CSharpCodeProvider - 这是一个简单的例子,它很容易理解,运气好。 (只涉及几个班级,IIRC。)

答案 1 :(得分:14)

几乎5年前乔恩的回答现在已经过时了。

来自"How LINQPad Works"(截至2016年1月29日):

  

LINQPad 5使用 Microsoft Roslyn库编译您的查询   (过去它使用的是.NET的CSharpCodeProvider和VBCodeProvider)。

您可以在此处看到如何使用Roslyn编译代码的示例: Learn Roslyn Now - Part 16 - The Emit API