LINQPad是如何编译代码的?

27
我猜它既不调用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[] { } });

1
csc.exe是使System.CodeDom工作的程序。还有集成开发环境(IDE)。 - Hans Passant
6
@Hans:差不多。更准确地说,csc.exe和IDE共享一个用于执行代码分析的公共库。 - Eric Lippert
+1 这是一个很好的问题,Jon Skeet再次做到了! - MoonKnight
2个回答

29

来自"LINQPad是如何工作的":

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

显然,这只是其中的一部分,但这就是您所询问的内容 - 阅读链接以获取更多详细信息。

如果您想查看一个更简单的实现,可以下载源代码,这是我为《C#深入》创建的小工具Snippy。同样,它使用CSharpCodeProvider - 这是一个足够简单的示例,希望您能轻松理解。(据我所知,只涉及几个类。)


@AaronAnodide 天哪...现在一切都有意义了! Skeet先生,您用智慧启迪了许多SO用户,我们将永远感激您(如果我不感谢他,今晚可能会消失)。 - Joshua Grosso Reinstate CMs

15

约翰(Jon)在将近5年前的答案现在已经过时了。

“如何使用LINQPad” (截至2016年1月29日)中可以看到:

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

您可以在此处查看如何使用Roslyn编译代码的示例: 现在学习Roslyn - 第16部分 - Emit API


1
Jon在他写下这个答案时是正确的。但是随后出现了LINQPad 5,它太棒了! - Edward

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接