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

person Aaron Anodide    schedule 23.04.2011    source источник
comment
csc.exe, это то, что заставляет System.CodeDom работать. И ИДЕ.   -  person Hans Passant    schedule 23.04.2011
comment
@ Ганс: Ну, почти. Было бы точнее сказать, что и csc.exe, и IDE имеют общую библиотеку, выполняющую анализ кода.   -  person Eric Lippert    schedule 23.04.2011
comment
+1 Это отличный вопрос, и Джон Скит делает это СНОВА!   -  person MoonKnight    schedule 03.03.2012


Ответы (2)


Из "Как работает LINQPad":

LINQPad компилирует ваши запросы, используя .NET CSharpCodeProvider (или VBCodeProvider)

Очевидно, что это еще не все, но это то, о чем вы спрашивали - прочитайте ссылку для более подробной информации.

Если вы хотите взглянуть на более простую реализацию, вы можете загрузить исходный код для Snippy, небольшой инструмент, который я создал для C# in Depth. Опять же, он использует CSharpCodeProvider — и это достаточно просто. пример, который легко понять, если повезет. (Участвует всего несколько классов, IIRC.)

person Jon Skeet    schedule 23.04.2011
comment
@AaronAnodide О, боже мой... ТЕПЕРЬ ВСЕ ИМЕЕТ СМЫСЛ! Мистер Скит, вы просветили своей мудростью многих СО-специалистов, и мы бесконечно вам благодарны (если бы я не поблагодарил его, я бы, наверное, исчез сегодня вечером). - person BalinKingOfMoria Reinstate CMs; 29.01.2016

Ответ Джона почти 5 лет назад устарел.

Из "Как работает LINQPad" (по состоянию на 29 января 2016 г.):

LINQPad 5 компилирует ваши запросы, используя библиотеки Microsoft Roslyn (ранее он использовал CSharpCodeProvider и VBCodeProvider .NET).

Вы можете увидеть пример использования Roslyn для компиляции кода здесь: Изучите Roslyn сейчас — Часть 16 — API Emit

person Edward    schedule 29.01.2016
comment
Ответ Джона был правильным, когда он его написал. Но затем появился LINQPad 5. Это потрясающе! - person Edward; 29.01.2016