Как LINQPad компилирует код? - PullRequest
26 голосов
/ 23 апреля 2011

Я предполагаю, что он не вызывает csc.exe и не реализует весь компилятор, так как он работает?

Обновление: спасибо Джону Скиту за указатель на код, который было легко выучить.

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

Ответы [ 2 ]

29 голосов
/ 23 апреля 2011

С "Как работает LINQPad" :

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

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

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

14 голосов
/ 29 января 2016

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

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

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

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

...