Dennis
Dennis

Reputation: 37770

How to run Roslyn instead csc.exe from command line?

After installing VS 2015, running csc.exe from command line causes this message to be displayed to console:

This compiler is provided as part of the Microsoft (R) .NET Framework, but only supports language versions up to C# 5, which is no longer the latest version. For compilers that support newer versions of the C# programming language, see http://go.microsoft.com/fwlink/?LinkID=533240

The link redirects to Roslyn's repository at GitHub.
So, is the a way to run "compilers that support newer versions" (Roslyn) from command line?

Upvotes: 27

Views: 11360

Answers (4)

ascpixi
ascpixi

Reputation: 597

The easiest way to invoke csc from the .NET SDK you have installed is via the csc dotnet tool:

dotnet tool install -g csc

...you can then verify if it has been installed correctly:

asc@ascpixi:~$ csc -version
4.8.0-7.24225.6 (de75b3c7)

This tool is but a simple wrapper over the managed csc.dll .NET itself uses.

Each .NET SDK installation contains a copy of csc under <SDK location>/Roslyn/bincore/csc.dll - it's a managed assembly you're supposed to execute with e.g. dotnet exec. For example:

asc@ascpixi:~$ dotnet --list-sdks
8.0.107 [/usr/lib/dotnet/sdk]
asc@ascpixi:~$ dotnet exec /usr/lib/dotnet/sdk/8.0.107/Roslyn/bincore/csc.dll -version
4.8.0-7.24225.6 (de75b3c7)

Upvotes: 0

StayCool
StayCool

Reputation: 552

I suspect the location of the Roslyn compiler moves around a lot based on the Visual Studio you're running.

I was able to find mine by performing a search like this:

cd "\Program Files (x86)"

dir /s csc*.* | findstr Roslyn

My particular csc.exe was located in:

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

Upvotes: 1

Ted
Ted

Reputation: 923

Roslyn from command line('cmd'), Windows 10 scenario example:
( Note: No need Visual Studio installed, but only the .NET core )

  1. Open 'cmd' and create folder "dotnet-csharp-tools":

    D:>mkdir "dotnet-csharp-tools"

  2. Navigate to folder "dotnet-csharp-tools":

    D:>cd "dotnet-csharp-tools"

  3. In folder "dotnet-csharp-tools" download 'nuget.exe' latest version from:

    https://www.nuget.org/downloads

  4. Check name of the last version of 'Microsoft.CodeDom.Providers.DotNetCompilerPlatform' from:

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

    For example: 'Microsoft.CodeDom.Providers.DotNetCompilerPlatform -Version 3.6.0'

  5. From 'cmd'(opened folder "dotnet-csharp-tools"), run command:

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

  6. From 'cmd' navigate to 'D:\dotnet-csharp-tools\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.3.6.0\tools\Roslyn472'(warning : folder name 'Roslyn472' may be different, if is other version)

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

  7. From 'File explorer' find 'csc.exe'(in the current folder 'Roslyn472'). Make copy of 'csc.exe' with name 'csc-roslyn.exe'(name can be whatever).

  8. For 'Windows 10', open:

    'Edit system environment variables' -> 'System variables' -> 'path' -> 'Edit' -> 'New' -> D:\dotnet-csharp-tools\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.3.6.0\tools\Roslyn472

  9. Close and open again 'cmd'(the command prompt). This 'cmd' restart needed, because 'system environment variables' are edited.

  10. Check if 'csc-roslyn' is recognized by 'cmd' by run command:

    csc-roslyn

  11. Create folder 'D:\csharp-projects'(folder name can be whatever) and create in 'D:\csharp-projects' C# source files, for example:

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. Open 'D:\csharp-projects' from 'cmd'(the command prompt) and run command:

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

  2. Run from 'cmd':

    Autoservice.exe

  3. Result should be:

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

Upvotes: 5

Jon Skeet
Jon Skeet

Reputation: 1501163

It sounds like your path is inappropriate, basically. If you open the "Developer Command Prompt for VS2015" you should have $ProgramFiles(x86)$\MSBuild\14.0\bin early in your path - and the csc.exe in there is Roslyn.

I suspect you're running the version in c:\Windows\Microsoft.NET\Framework\4.0.30319 or similar - which is the legacy one, basically.

Upvotes: 32

Related Questions