【问题标题】:How does LINQPad compile code?LINQPad 是如何编译代码的?
【发布时间】:2011-04-23 19:26:13
【问题描述】:

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

【问题讨论】:

  • csc.exe,它是 System.CodeDom 工作的原因。还有 IDE。
  • @Hans:嗯,差不多。更准确的说法是 csc.exe 和 IDE 共享一个执行代码分析的公共库。
  • +1 这是一个很好的问题,Jon Skeet 又做了一次!

标签: c# linqpad


【解决方案1】:

来自"How LINQPad Works"

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

显然还有更多内容,但这就是您询问的内容 - 请阅读链接了解更多详细信息。

如果你想看一个更简单的实现,你可以download the source code 获取 Snippy,这是我为 C# 深度创建的小工具。同样,它使用CSharpCodeProvider - 这是一个足够简单的示例,很容易理解,运气好的话。 (只涉及几个类,IIRC。)

【讨论】:

  • @AaronAnodide 哦,天哪……现在一切都变得有意义了!斯基特先生,您的智慧启发了许多 SO-ers,我们永远感激不尽(如果我不感谢他,我今晚可能会消失)。
【解决方案2】:

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

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

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

您可以在此处查看如何使用 Roslyn 编译代码的示例: Learn Roslyn Now - Part 16 - The Emit API

【讨论】:

  • 乔恩写的时候回答是正确的。但随后 LINQPad 5 出现了。太棒了!
猜你喜欢
  • 2020-01-12
  • 1970-01-01
  • 1970-01-01
  • 2014-01-10
  • 2019-05-27
  • 1970-01-01
  • 2011-06-14
  • 2012-09-26
  • 2015-11-13
相关资源
最近更新 更多