LINQPad是如何编译代码的

本文关键字:编译 代码 何编译 LINQPad | 更新日期: 2023-09-27 17:52:16

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

LINQPad是如何编译代码的

选自"How LINQPad Works":

LINQPad使用。net的CSharpCodeProvider(或VBCodeProvider)编译你的查询

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

如果你想看一个更简单的实现,你可以下载Snippy的源代码,这是我为c#深度创建的小工具。同样,它使用CSharpCodeProvider,这是一个足够简单的例子,很容易理解,如果运气好的话。(只涉及几个类,IIRC)

Jon 5年前的回答现在已经过时了。

摘自"LINQPad如何工作"(截至2016年1月29日):

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

你可以在这里看到一个如何使用Roslyn来编译代码的例子:现在学习Roslyn -第16部分- Emit API