Можно ли скомпилировать один файл кода C# with.net основной компилятор Roslyn?

в старом .net мы использовали, чтобы запустить компилятор csc для компиляции одного cs-файла или нескольких файлов. С .net core у нас есть dotnet build которые настаивают на наличии надлежащего файла проекта. Есть ли автономный компилятор командной строки, который позволит компилировать файлы исходного кода без проекта (и перечисления ссылочных зависимостей в той же командной строке)?

в Linux, когда у меня установлен старый csc и новый .net core, я получаю эти тайминги:

[root@li1742-80 test]# time dotnet build
Microsoft (R) Build Engine version 15.3.409.57025 for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.

  test -> /root/test/bin/Debug/netcoreapp2.0/test.dll

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:03.94

real    0m7.027s
user    0m5.714s
sys     0m0.838s

[root@li1742-80 test]# time csc Program.cs
Microsoft (R) Visual C# Compiler version 2.3.0.61801 (3722bb71)
Copyright (C) Microsoft Corporation. All rights reserved.


real    0m0.613s
user    0m0.522s
sys     0m0.071s
[root@li1742-80 test]#

Примечание 7 секунды с .net core против нескольких сотен миллисекунд со старым csc для того же Program.cs.

Я хотел бы иметь возможность компилировать так же быстро с .net core, как раньше с csc.

3 ответов


да, можно скомпилировать один файл с компиляторами csc или vbc в .NET Core.

; TL; DR; для вызова компилятора Roslyn напрямую необходимо использовать драйвер командной строки csc.{exe / dll} и так как Рослин в отличие от старого csc.exe не ссылается на mscorlib.dll неявно необходимо передать ссылку на требуемые зависимости, т. е. System.Runtime и System.Private.CoreLib библиотеки и любые другие необходимые справки. В следующем списке показано, как чтобы скомпилировать следующее


компилятор можно напрямую вызвать с помощью

$ /usr/local/share/dotnet/sdk/2.0.0/Roslyn/RunCsc.sh

однако эта конкретная команда может быть не очень полезна без поддерживающей инфраструктуры проекта, потому что вам нужно будет передать все сборки .NET Core или .NET Standard вручную, которые обычно обрабатываются SDK и NuGet. Вы получите такие ошибки:

$ /usr/local/share/dotnet/sdk/2.0.0/Roslyn/RunCsc.sh Program.cs
Microsoft (R) Visual C# Compiler version 2.3.2.61921 (ad0efbb6)
Copyright (C) Microsoft Corporation. All rights reserved.

Program.cs(1,7): error CS0246: The type or namespace name 'System' could not be found (are you missing a using directive or an assembly reference?)
Program.cs(5,11): error CS0518: Predefined type 'System.Object' is not defined or imported
Program.cs(7,26): error CS0518: Predefined type 'System.String' is not defined or imported
Program.cs(7,16): error CS0518: Predefined type 'System.Void' is not defined or imported

короче говоря, он не поддерживается без предопределенного проекта.

но комментарий @Andrew показывает, что это все еще возможно, если вы готовы перечислить все зависимости, включая неявные Системные, в параметрах командной строки.

с ошибка CS0518: система предопределенного типа.Объект " не определен и не импортирован #12393:

на данный момент у нас нет плана, чтобы сделать его простым в использовании csc.exe в этом манера. Руководство для использования инструмент CLI dotnet на время бытие. Даже если какая-то модификация будет сделана здесь, она будет на рамки для обеспечения унифицированной и / или упрощенной справочной информации сборки для компилятора. Компилятор никогда не будет иметь больше сложный тип или разрешение сборки, чем сейчас (по дизайну).

см. также закрытая сделать возможным прямой вызов компилятора #7689.