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