如何在命令行中运行Roslyn而不是csc.exe?

26
安装了VS 2015后,从命令行运行csc.exe会显示以下消息到控制台:

该编译器是Microsoft (R) .NET Framework的一部分,但仅支持C# 5及以下版本的语言,这已不是最新版本。 如需支持较新版本C#编程语言的编译器,请参阅http://go.microsoft.com/fwlink/?LinkID=533240

链接将重定向到GitHub上的Roslyn存储库。
那么有没有办法从命令行运行“支持较新版本”的编译器(Roslyn)?

1
你正在运行哪个 csc.exe?它报告了什么版本号?当我从命令行运行 csc.exe - 使用 VS2015 的开发人员命令提示符 - 我看到版本号为 1.0.0.50618,这是 Roslyn。 - Jon Skeet
@JonSkeet:我正在从“%Windir%\Microsoft.NET\Framework64\v4.0.30319”运行csc。我没有使用开发人员命令提示符的批处理文件,只是一个没有任何特殊设置的cmd。 - Dennis
1
那我建议你使用msbuild中的csc :) 请看我的回答。如果你想运行开发者命令,使用开发者命令提示符似乎是个明智的选择... - Jon Skeet
1
这不是完全相同的问题,但请查看此问题 - https://dev59.com/H43da4cB1Zd3GeqP1Ifn#31698761。 - Luaan
3个回答

32

听起来你的路径不正确。如果你打开 "VS2015 开发人员命令提示",你应该在你的路径中早期有 $ProgramFiles(x86)$\MSBuild\14.0\bin - 并且在那里的 csc.exe 就是 Roslyn。

我怀疑你正在运行类似于 c:\Windows\Microsoft.NET\Framework\4.0.30319 的遗留版本。


感谢您提供新编译器的路径。我已经尝试过搜索,但没有任何成功。 - Dennis
技术上讲,它不是%ProgramFilesx86%,应该是%ProgramFiles(x86)%。 - nrudnyk
1
@nrudnyk:已修复。 - Jon Skeet
如果您没有安装Visual Studio怎么办?有没有一种方法可以独立安装Roslyn编译器? - Jonathan Gilbert
@JonathanGilbert:安装.NET Core SDK也会通过dotnet安装Roslyn...我不知道有没有一种方法可以在不安装VS的情况下获得csc.exe的体验。(也许是.NET SDK?好久没用过了...) - Jon Skeet
2
我进行了更深入的挖掘,并发现您可以仅安装Visual Studio的构建工具:https://go.microsoft.com/fwlink/?linkid=840931您仍然需要通过Visual Studio Installer进行操作,但这不会安装VS Shell或任何重量级的东西。您只需获得一个开发人员命令提示符的链接和一个在PATH上的CSC,它正好可以满足我的需求。 :-) - Jonathan Gilbert

5

示例:从命令行(“cmd”)使用Roslyn,适用于Windows 10场景:
(注意:无需安装Visual Studio,但需要安装.NET Core)

  1. 打开命令提示符(cmd),并创建文件夹"dotnet-csharp-tools":

    D:>mkdir "dotnet-csharp-tools"

  2. 进入文件夹 "dotnet-csharp-tools":

    D:>cd "dotnet-csharp-tools"

  3. 在文件夹"dotnet-csharp-tools"中从以下网址下载'nuget.exe'最新版本:

    https://www.nuget.org/downloads

  4. 查看'Microsoft.CodeDom.Providers.DotNetCompilerPlatform'的最新版本名称:

    https://www.nuget.org/packages/Microsoft.CodeDom.Providers.DotNetCompilerPlatform/

    例如:'Microsoft.CodeDom.Providers.DotNetCompilerPlatform -Version 3.6.0'

  5. 从“cmd”(在“dotnet-csharp-tools”文件夹中)运行以下命令:

    D:\dotnet-csharp-tools>nuget install Microsoft.CodeDom.Providers.DotNetCompilerPlatform -Version 3.6.0

  6. 从“cmd”中导航到'D:\dotnet-csharp-tools\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.3.6.0\tools\Roslyn472'(注意:如果是其他版本,则文件夹名称'Roslyn472'可能不同)

    D:\dotnet-csharp-tools>cd Microsoft.CodeDom.Providers.DotNetCompilerPlatform.3.6.0\tools\Roslyn472

  7. 从“文件浏览器”中找到 'csc.exe'(在当前文件夹'Roslyn472'中)。 将 'csc.exe' 复制并重命名为 'csc-roslyn.exe'(名称可以是任何名称)。

  8. 对于“Windows 10”,打开:

    '编辑系统环境变量' -> '系统变量' -> 'path' -> '编辑' -> '新建' -> D:\dotnet-csharp-tools\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.3.6.0\tools\Roslyn472

  9. 关闭并重新打开“cmd”(命令提示符)。 必须重新启动此“cmd”,因为已编辑系统环境变量。

  10. 运行以下命令,检查是否可以通过“cmd”识别'csc-roslyn':

    csc-roslyn

  11. 创建文件夹'D:\csharp-projects'(文件夹名称可以是任何名称) 并在'D:\csharp-projects'中创建C#源代码文件,例如:

Vehicle.cs

class Vehicle
{
    private string name = "unknown";
    private int producedYear = -1;

    public Vehicle(string name, int producedYear)
    {
        this.Name = name;
        this.ProducedYear = producedYear;
    }

    public string Name
    {
        get { return this.name; }
        set { this.name = value; }
    }

    public int ProducedYear
    {
        get { return this.producedYear; }
        set { this.producedYear = value; }
    }
}

Car.cs

class Car : Vehicle
{
    private string maker = "unknown";

    public Car(string name, int age, string maker)
    : base(name, age)
    {
        this.Maker = maker;
    }

    public string Maker
    {
        get { return this.maker; }
        set { this.maker = value; }
    }

    public override string ToString()
    {
        return $"{this.Name}, {this.ProducedYear}, {this.Maker}";
    }
}

Autoservice.cs

using System;

class Autoservice
{
    public static void Main()
    {
        
        Car car1 = new Car("Ford Taunus", 1971, "Ford");
        Car car2 = new Car("Opel Ascona", 1978, "Opel");
        Car car3 = new Car("Saab 900", 1984, "Saab");

        Console.WriteLine(car1);
        Console.WriteLine(car2);
        Console.WriteLine(car3);
    }
}
  1. 从“cmd”(命令提示符)打开“D:\ csharp-projects”,并运行以下命令:

    csc-roslyn /target:exe /out:Autoservice.exe Vehicle.cs Car.cs Autoservice.cs

  2. 在“cmd”中运行:

    Autoservice.exe

  3. 结果应该是:

Ford Taunus,1971,福特
Opel Ascona,1978,Opel
Saab 900,1984,Saab


独立的Roslyn编译器安装 - 感谢这个,如果有人尝试上述命令并且nuget安装失败(404未找到),请使用以下命令。 nuget install Microsoft.CodeDom.Providers.DotNetCompilerPlatform -Version 3.6.0 -Source https://api.nuget.org/v3/index.json -Source 选项启用了V3 nuget终端而非V2。 - Rishabh Puri
绝对值得给个赞。在Windows 11上使用Powershell时,我对环境变量有点迷茫,但代码示例第一次就成功了。我只有C盘,没有D盘。 - undefined

0

我怀疑Roslyn编译器的位置会根据您运行的Visual Studio而经常变动。

我能够通过执行以下搜索来找到我的编译器:

cd "\Program Files (x86)"

dir /s csc*.* | findstr Roslyn

我的特定csc.exe位于:

C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\Roslyn\csc.exe


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接