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

从“LINQPad如何工作” :

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

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

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

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

从“LINQPad如何工作” (截至2016年1月29日):

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

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