LINQPad如何编译代码?

问题描述:

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

更新:感谢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[] { } }); 
+0

CSC.EXE,这是什么使System.CodeDom工作。和IDE。 – 2011-04-23 19:30:53

+4

@Hans:差不多。说csc.exe和IDE共享执行代码分析的通用库会更准确。 – 2011-04-23 19:48:46

+0

+1这是一个很好的问题,Jon Skeet再次重演! – MoonKnight 2012-03-02 20:47:30

"How LINQPad Works"

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

显然还有相当多给它你的查询,但是这就是你问起位 - 读链接了解更多详情。

如果你想看看一个更简单的实现,你可以为0123iSnippy,我为深度C#创建的小工具。再次,它使用CSharpCodeProvider - 这是一个足够简单的例子,它很容易理解,运气不错。 (只涉及几个类,IIRC。)

+8

神圣烟 - 我刚才意识到IIRC的含义..看,我总是试图理解为什么一个互联网聊天协议的界面似乎在陌生的地方弹出:) – 2011-04-23 21:02:46

+0

伊利诺斯州互动报告卡? – Anders 2012-08-13 19:06:16

+0

@AaronAnodide噢,我的天啊......现在所有人都感觉到了! Skeet先生,你用你的智慧启迪了许多SO-ers,我们永远感激(如果我不感谢他,我今晚可能会消失)。 – BalinKingOfMoria 2016-01-29 02:51:11

乔恩从近5年前的答案现在已过时。

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

LINQPad 5编译使用微软罗斯林库 (在过去,它使用.NET的CSharpCodeProvider和VBCodeProvider)查询。

你可以看到如何使用罗斯林编译代码这里一个例子: Learn Roslyn Now - Part 16 - The Emit API

+3

DARE你与Jon Skeet相矛盾吗?你不会逍遥法外...... – BalinKingOfMoria 2016-01-29 02:51:45

+0

乔恩的回答在他写的时候是正确的。但随后LINQPad 5出现了。太奇妙了! – Edward 2016-01-29 03:01:20

+2

我知道,我只是在和你搞砸:)谢谢你的更新答案。 – BalinKingOfMoria 2016-01-29 03:12:53