Interactive C# on Linux
How to use dotnet tool to run C# commands interactively on a Linux (Ubuntu) machine
February 6, 2019
C# interactive is a handy tool inside Visual Studio (powered by Roslyn), which allows you to experiment with blocks of C# code without the need to load up whole new solution. This post is about dotnet-script, a global dotnet CLI tool, which works everywhere where .NET Core runs and provides the same functionality as C# interactive.
Why? If you do cross-platform development with .NET Core (which is perfecly feasible and you should totally do it), you might get into situations where you need to test how the framework behaves on different platforms. Typical are filesystem paths, where .NET constants return different values on Windows, Mac and Linux. In my case I wanted to see where the active user’s profile is on each operating system, by using the
Install .NET Core SDK
Follow instructions for your repo. I used Ubuntu 18.04, so my command sequence was:
wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb sudo dpkg -i packages-microsoft-prod.deb sudo add-apt-repository universe sudo apt-get install apt-transport-https sudo apt-get update sudo apt-get install dotnet-sdk-2.2 dotnet --version > 2.2.103
With dotnet SDK installed, it’s time to install the dotnet-script global tool:
dotnet tool install -g dotnet-script > You can invoke the tool using the following command: dotnet-script > Tool 'dotnet-script' (version '0.28.0') was successfully installed.
It might happen (aka “happened to me”) that the installer doesn’t update PATH properly. Dotnet global tools are installed to the
$HOME/.dotnet/tools directory, so this should be added to PATH:
echo $PATH > /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/martin/.dotnet/tools
Not there? Just run:
Finally, it should be possible to run:
And start scripting:
> 2+2 4 > Console.WriteLine("Hello"); Hello > Console.WriteLine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)); /home/martin
I didn’t need it for my case, but there are some advanced features to the REPL interface too:
> #r "nuget: Newtonsoft.Json" > using Newtonsoft.Json; > ....
Reset to initial state