Running a C# program with command line prompts in Visual Studio Code - c#

I am running an inherited project written in C# inside Visual Studio Code. In order for this application to run, it needs to take command line input (-t, -h, etc). How do I test this from inside Visual Studio?
Currently (I've been learning dotnet, C#, VS, etc as I go) I have a hello world program I can run from vsc's terminal. For a reason I haven't been able to pinpoint, probably how I installed it, dotnet run isn't recognized - I have to feed it an explicit path to dotnet.exe: C:\Program Files\dotnet\dotnet.exe run
How can I do this when the program requires command line input? My shot in the dark of C:\Program Files\dotnet\dotnet.exe run -t predictably didn't work, but I'm not sure what else to try.
Thanks!

If you are using dotnet.exe run to start your application you need add the -- switch statement to instruct dotnet.exe to pass the arguments to your application. For example
Microsoft Documentation
dotnet.exe run -- -arg1 -arg2 (etc) notice the -- after the dotnet arguments and before your program specific arguments.
GitHub Issue

Run with Terminal
When you run your code using terminal you must add ' -- ' to tell dotnet you are running your code with an argument/s
C:>dotnet run -- <your arguments here>
Run with Debugger
Locate your .vscode folder inside your project if not create one.
Open the launch.json file
You will see a json object and add your arguments inside the "args" key.
launch.json
"configurations": [
{
"name": ".NET Core Launch (console)",
"args": [], // PUT YOUR ARGUMENTS HERE
...
}
]

I tried to add a comment to Nico's answer but I lack sufficient reputation points. I was confused by the dash character in front of each arg: "-arg1 -arg2 (etc)". For clarity I would like to point out that .NET Core 2.1 seems to not need this. In the case of my console app, it takes a date for the first arg, an integer for the second, then an operator (+ or -) for the third arg. If I entered the following:
C:\>dotnet run -- -7/13/2018 -30 -+
I found that the leading dash in front of each arg was passed into the program along with the intended arg and I ended up trying to date parse "-7/13/2018"
I got the expected result when I entered it like this:
C:\>dotnet run -- 7/13/2018 30 +

Since OP is specifically asking about how to do this in Visual Studio Code, they are likely using VSCode's run feature (not the dotnet CLI as other answers assume), to run their application. In this case, the proper way to supply command line arguments is via the .vscode\launch.json file.
Add an args array attribute to your configuration and populate it with the arguments you would like to pass.
"configurations": [
{
// ... ,
"args": ["-arg1", "-arg2"]
}

Right click on your project
Click Properties
Click Debug in the Properties window
Under "start options:"
Add a "Command Line Argument:" = run -t
Add a "Working Directory:" try the bin\debug directory

Related

How to remove the file path from the Code Runner (VSCode extension) run command for C#?

When using the VSCode extension Code Runner for my C# .NET 6 console app, after hitting the run button, the following command runs in the terminal:
❯ dotnet run "/home/USER/code/c#/MyApp/Program.cs"
Hello, World!
~/code/c#/MyApp ❯
I am wondering how to remove the file path after 'dotnet run'. Given that I am already in the console application directory, I would like for the extension to only execute the 'dotnet run' command, which would achieve the same result. I can demonstrate this by running the command myself without including the file path to the 'Program.cs' file at the end:
❯ dotnet run
Hello, World!
~/code/c#/MyApp ❯
This is purely an aesthetic matter, but it has been bugging me a lot and I've spent more than two hours now trying to figure out a solution for this.
Go to settings in vs code
In the search bar, type "user se"
You will see Edit in settings.json, click on it
Add "code-runner.showExecutionMessage": false,
Enjoy
Go to Vs code setting
Uncheck Show Execution Message option

How do you pass parameters into a C# .Net Core project? [duplicate]

I am running an inherited project written in C# inside Visual Studio Code. In order for this application to run, it needs to take command line input (-t, -h, etc). How do I test this from inside Visual Studio?
Currently (I've been learning dotnet, C#, VS, etc as I go) I have a hello world program I can run from vsc's terminal. For a reason I haven't been able to pinpoint, probably how I installed it, dotnet run isn't recognized - I have to feed it an explicit path to dotnet.exe: C:\Program Files\dotnet\dotnet.exe run
How can I do this when the program requires command line input? My shot in the dark of C:\Program Files\dotnet\dotnet.exe run -t predictably didn't work, but I'm not sure what else to try.
Thanks!
If you are using dotnet.exe run to start your application you need add the -- switch statement to instruct dotnet.exe to pass the arguments to your application. For example
Microsoft Documentation
dotnet.exe run -- -arg1 -arg2 (etc) notice the -- after the dotnet arguments and before your program specific arguments.
GitHub Issue
Run with Terminal
When you run your code using terminal you must add ' -- ' to tell dotnet you are running your code with an argument/s
C:>dotnet run -- <your arguments here>
Run with Debugger
Locate your .vscode folder inside your project if not create one.
Open the launch.json file
You will see a json object and add your arguments inside the "args" key.
launch.json
"configurations": [
{
"name": ".NET Core Launch (console)",
"args": [], // PUT YOUR ARGUMENTS HERE
...
}
]
I tried to add a comment to Nico's answer but I lack sufficient reputation points. I was confused by the dash character in front of each arg: "-arg1 -arg2 (etc)". For clarity I would like to point out that .NET Core 2.1 seems to not need this. In the case of my console app, it takes a date for the first arg, an integer for the second, then an operator (+ or -) for the third arg. If I entered the following:
C:\>dotnet run -- -7/13/2018 -30 -+
I found that the leading dash in front of each arg was passed into the program along with the intended arg and I ended up trying to date parse "-7/13/2018"
I got the expected result when I entered it like this:
C:\>dotnet run -- 7/13/2018 30 +
Since OP is specifically asking about how to do this in Visual Studio Code, they are likely using VSCode's run feature (not the dotnet CLI as other answers assume), to run their application. In this case, the proper way to supply command line arguments is via the .vscode\launch.json file.
Add an args array attribute to your configuration and populate it with the arguments you would like to pass.
"configurations": [
{
// ... ,
"args": ["-arg1", "-arg2"]
}
Right click on your project
Click Properties
Click Debug in the Properties window
Under "start options:"
Add a "Command Line Argument:" = run -t
Add a "Working Directory:" try the bin\debug directory

Get Command used to run Process

In a C program in Linux, I can use the first argument to get the command that was used to run a process. Is there a way to do something similar for C#?
For example, if I use dotnet run/dotnet to run the program or double-click a published executable, is it possible to retrieve that programmatically (dotnet run, dotnet <…>.dll, or <executable path>)?
I can get the DLL/EXE that is running with System.Reflection.Assembly.GetExecutingAssembly().Location, but that doesn't help much when the user is running the project directly with dotnet run instead of dotnet <…>.dll.
You can use the Environment.CommandLine property to get the command line for the current program. Note that in the case of dotnet run myassembly.exe, the dotnet run part is dropped. E.g. if the command line is dotnet run myassbembly.exe foo bar, the Environment.CommandLine property will contain myassembly.exe foo bar.

Visual Studio Code C# Project has incorrect assembly (program) path (HPD)

When I create a C# project within Visual Studio Code v1.16.1, I execute the following commands from a command prompt:
dotnet new console -o TestConsoleApp
cd TestConsoleApp
code .
Visual Studio then launches with a sample "Hello World" console application.
I have the C# extension by OmniSharp installed:
But when I attempt to debug the application (F5) I get the following:
which reads:
Error launch: program
'c:\Dev\VSCode\TestConsoleApp\bin\Debug\netcoreapp2.0\TestConsoleApp.dll'
does not exist.
The reason for this is because the launch.json specifies the program as
"program": "${workspaceRoot}/bin/Debug/netcoreapp2.0/TestConsoleApp.dll",
But the application, when it loads for the first time creates the path as:
~\bin\HPD\Debug\netcoreapp2.0
And stores all the appropriate assembly information at that location.
Why is HPD appearing in the actual program path? It would appear that it is extraneous, and I used nothing but the defaults when installing. I can't figure out why it is being added to the path.
If I adjust the launch.json, then everything works fine. It isn't clear why the "HPD" is being added when the project is created.
This can happen when an environment variable overrides values in the build process. The variable that drives this is Configuration.
Check your system and user environment variables if any Configuration variable is set. The sample problem applies to Platform variables (usually set on some HP laptops).

Compiling/Executing a C# Source File in Command Prompt

How do you compile and execute a .cs file from a command-prompt window?
CSC.exe is the CSharp compiler included in the .NET Framework and can be used to compile from the command prompt. The output can be an executable ".exe", if you use "/target:exe", or a DLL; If you use /target:library, CSC.exe is found in the .NET Framework directory,
e.g. for .NET 3.5, c:\windows\Microsoft.NET\Framework\v3.5\.
To run, first, open a command prompt, click "Start", then type cmd.exe.
You may then have to cd into the directory that holds your source files.
Run the C# compiler like this:
c:\windows\Microsoft.NET\Framework\v3.5\bin\csc.exe
/t:exe /out:MyApplication.exe MyApplication.cs ...
(all on one line)
If you have more than one source module to be compiled, you can put it on that same command line. If you have other assemblies to reference, use /r:AssemblyName.dll .
Ensure you have a static Main() method defined in one of your classes, to act as the "entry point".
To run the resulting EXE, type MyApplication, followed by <ENTER> using the command prompt.
This article on MSDN goes into more detail on the options for the command-line compiler. You can embed resources, set icons, sign assemblies - everything you could do within Visual Studio.
If you have Visual Studio installed, in the "Start menu"; under Visual Studio Tools, you can open a "Visual Studio command prompt", that will set up all required environment and path variables for command line compilation.
While it's very handy to know of this, you should combine it with knowledge of some sort of build tool such as NAnt, MSBuild, FinalBuilder etc. These tools provide a complete build environment, not just the basic compiler.
On a Mac
On a Mac, syntax is similar, only C sharp Compiler is just named csc:
$ csc /target:exe /out:MyApplication.exe MyApplication.cs ...
Then to run it :
$ mono MyApplication.exe
Another way to compile C# programs (without using Visual Studio or without having it installed)
is to create a user variable in environment variables, namely "PATH".
Copy the following path in this variable:
"C:\Windows\Microsoft.NET\Framework\v4.0.30319"
or depending upon which .NET your PC have.
So you don't have to mention the whole path every time you compile a code.
Simply use
"C:\Users\UserName\Desktop>csc [options] filename.cs"
or wherever the path of your code is.
Now you are good to go.
You can compile a C# program :
c: > csc Hello.cs
You can run the program
c: > Hello
For the latest version, first open a Powershell window, go to any folder (e.g. c:\projects\) and run the following
# Get nuget.exe command line
wget https://dist.nuget.org/win-x86-commandline/latest/nuget.exe -OutFile nuget.exe
# Download the C# Roslyn compiler (just a few megs, no need to 'install')
.\nuget.exe install Microsoft.Net.Compilers
# Compiler, meet code
.\Microsoft.Net.Compilers.1.3.2\tools\csc.exe .\HelloWorld.cs
# Run it
.\HelloWorld.exe
An example HelloWorld.cs
using System;
public class HelloWorld {
public static void Main()
{
Console.WriteLine("Hello world!");
}
}
You can also try the new C# interpreter ;)
.\Microsoft.Net.Compilers.1.3.2\tools\csi.exe
> Console.WriteLine("Hello world!");
Hello world!
While it is definitely a good thing knowing how to build at the command line, for most work it might be easier to use an IDE. The C# express edition is free and very good for the money ;-p
Alternatively, things like snippy can be used to run fragments of C# code.
Finally - note that the command line is implementation specific; for MS, it is csc; for mono, it is gmcs and friends.... Likewise, to execute: it is just "exename" for the MS version, but typically "mono exename" for mono.
Finally, many projects are build with build script tools; MSBuild, NAnt, etc.
Here is how to install MSBuild with standalone C# 7.0 compiler which is no longer bundled in the latest .Net Framework 4.7:
Is it possible to install a C# compiler without Visual Studio?
Then just run
"C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\Roslyn\csc.exe" MyApplication.cs
to compile single source file to executable.
Also note that .Net Core doesn't support compiling single source file without preconfigured project.
Add to path
C:\Windows\Microsoft.NET\Framework\v3.5
To Compile:
csc file.cs
To Execute:
file
PowerShell can execute C# code out of the box.
One liner to compile & execute a file:
(Add-Type -Path "Program.cs" -PassThru)::Main() #'Main' is the entry point
Supposed you have a .cs file like this:
using System;
public class Program
{
public static void Main()
{
Console.WriteLine("Hello from C#");
}
}
You can build your class files within the VS Command prompt (so that all required environment variables are loaded), not the default Windows command window.
To know more about command line building with csc.exe (the compiler), see this article.
In Windows systems, use the command csc <filname>.cs in the command prompt while the current directory is in Microsoft Visual Studio<Year><Version>
There are two ways:
Using the command prompt:
Start --> Command Prompt
Change the directory to Visual Studio folder, using the command: cd C:\Program Files (x86)\Microsoft Visual Studio\2017\ <Version>
Use the command: csc /.cs
Using Developer Command Prompt :
Start --> Developer Command Prompt for VS 2017
(Here the directory is already set to Visual Studio folder)
Use the command: csc /.cs
Once you write the c# code and save it. You can use the command prompt to execute it just like the other code.
In command prompt you enter the directory your file is in and type
To Compile:
mcs yourfilename.cs
To Execute:
mono yourfilename.exe
if you want your .exe file to be different with a different name, type
To Compile:
mcs yourfilename.cs -out:anyname.exe
To Execute:
mono anyname.exe
This should help!
If you have installed Visual Studio then you have Developer Command Prompt for VS. You can easily build your program using csc command and run your application with the name of the application inside the developer command prompt.
You can open Developer command prompt as given below.
Start => Developer Command Prompt for VS
Hope this helps!
I found a simple way to do this if you have the correct system and environmental variables set up and your path is properly configured.
you just need to run in the directory of the project
dotnet new console --> this will generate the required files such as the .csproj. it will also generate a Program.cs file which it automatically uses as the entry point, if you have other files with your static Main method you can remove this file and it should find the Main entry point automatically.
then all you need to do to run is
dotnet run and it should compile and run automatically
this was how i managed to get my projects working in vs code using gitbash as my terminal. Also I have VS 2019 installed, i used the .net 5.0 framework from this as my system variables. This was the simplest solution i found for basic console programs. It also allows you to add custom imports in your .csproj file
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\Roslyn
this is where you can find the c# compiler that supports c#7 otherwise it will use the .net 4 compilers which supports only c# 5
# File : csharp.ps1
# Purpose : Powershell Script to compile a csharp console application from powershell prompt
try {
# CSharp Compiler
#$csc = "C:\Windows\Microsoft.NET\Framework\v3.5\bin\csc.exe"
$csc = "C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe"
# NOTE: if this path doesn't work search Framework folder for csc.exe
$ErrorActionPreference = 'Stop'
if ($args.Count -eq 0) {
write-host "`nUSAGE: csharp.ps1 (console_application.cs)"
exit 1
}
$file = $args[0];
if (-not(test-path $file)) {
throw "file doesn't exist: $file"
}
$cmd = "$csc /nologo /t:exe /out:${file}.exe $file"
write-host -ForegroundColor Green "`nx: $cmd"
invoke-expression $cmd
}
catch {
write-host -ForegroundColor Red "`nEXCEPTION: $_"
}
finally {
write-host ""
}
// File: helloworld.cs
using System;
namespace MyProgram
{
class Program
{
public static void Main(string[] args)
{
Console.Write("Hello World...");
Console.ReadKey(true);
}
}
}
PS> .\csharp.ps1 helloworld.cs
Search "Path" in windows
Select "Edit the system environment.."
Click on "Environment Variable" right bottom
Double Click on Path in Variable Section
Click on
New and add the path (you Want to add)
Click Okay Okay Okay
for me to run csc from command Prompt
Added this "C:\Windows\Microsoft.NET\Framework\v4.0.30319" to path
then open command prompt where my file is located, and ran this
PS C:\Users\UserName\Downloads\Mouse> csc.exe Mouse.cs
dotnet
This is oooold. But since this is where you end up as a beginner when you ask questions to understand how to use C# like C or C++ in a console using compilers without Visual Studio CE (highly recommended for C# btw if you aren't already using it) you end up getting more confused within the lingo of .NET framework and libraries and SDKs.
If someone like you stumbles upon my answer as a complete beginner:
1. Understand the difference between Framework and SDK.
2. Understand what C# is and what .NET is.
3. THIS: https://dotnet.microsoft.com/learn/dotnet/hello-world-tutorial/intro
You'll pick up the rest along the way.
But instead of using framework I suggest using the SDK and mostly sticking to VS. As for me, I learned C# for unity and mostly game dev.
Also Google is your friend. Ask Questions, stay curious.

Categories