Подтвердить что ты не робот

Как LINQPad компилирует код?

Я предполагаю, что он не вызывает 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[] { } });
4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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