Launching an application (.EXE) from C#?
Use System.Diagnostics.Process.Start()
method.
Check out this article on how to use it.
Process.Start("notepad", "readme.txt");
string winpath = Environment.GetEnvironmentVariable("windir");
string path = System.IO.Path.GetDirectoryName(
System.Windows.Forms.Application.ExecutablePath);
Process.Start(winpath + @"\Microsoft.NET\Framework\v1.0.3705\Installutil.exe",
path + "\\MyService.exe");
How can I run an EXE file from my C# code?
using System.Diagnostics;
class Program
{
static void Main()
{
Process.Start("C:\\");
}
}
If your application needs cmd arguments, use something like this:
using System.Diagnostics;
class Program
{
static void Main()
{
LaunchCommandLineApp();
}
/// <summary>
/// Launch the application with some options set.
/// </summary>
static void LaunchCommandLineApp()
{
// For the example
const string ex1 = "C:\\";
const string ex2 = "C:\\Dir";
// Use ProcessStartInfo class
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.CreateNoWindow = false;
startInfo.UseShellExecute = false;
startInfo.FileName = "dcm2jpg.exe";
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.Arguments = "-f j -o \"" + ex1 + "\" -z 1.0 -s y " + ex2;
try
{
// Start the process with the info we specified.
// Call WaitForExit and then the using statement will close.
using (Process exeProcess = Process.Start(startInfo))
{
exeProcess.WaitForExit();
}
}
catch
{
// Log error.
}
}
}
Run an exe file from code
System.Diagnostics is included by default.
You just need to add a using (e.g. using System.Diagnostics;
) or you can declare the variable as System.Diagnostics.Process process;
code:
string exeFileAndLocation = @"C:\myConsoleApplication.exe";
string arguments = "sampleArgument";
System.Diagnostics.Process.Start(exeFileAndLocation, arguments);
Run exe file in c# within the program folder
Just use the relative path:
System.Diagnostics.Process.Start(@"Program 1.exe");
The code above will work if Program 1.exe
is in the same directory as the program running that code and the current working directory was not modified using a shortcut for example.
If not then you'll have to find out the path relative to your program (the one that should be in bin/debug/
)
Launching C# program from another C# program
Ok For Future reference:
Pathing to the files can be correct and everything might be in order but if you are using DLLs for imports. Change the process's working directory.
The project will run, libs can "sometimes" be found but can cause a weird unknown bug like this one. So the most optimal way of running another C# instance with SDL or any other kind of library:
private void RunSDLProgram()
{
FileInfo spectrumFileInfo = new FileInfo("pathToFile.exe");
ProcessStartInfo info = new ProcessStartInfo(spectrumFileInfo.FullName);
info.RedirectStandardOutput = true;
info.RedirectStandardError = true;
info.UseShellExecute = false;
info.WorkingDirectory = spectrumFileInfo.DirectoryName;
pVizualizer = new Process();
pVizualizer.StartInfo = info;
pVizualizer.EnableRaisingEvents = true;
pVizualizer.Exited += new EventHandler(myProcess_Exited);
pVizualizer.Start();
}
private void myProcess_Exited(object sender, System.EventArgs e)
{
Console.WriteLine(
$"Exit time : {pVizualizer.ExitTime}\n" +
$"Exit code : {pVizualizer.ExitCode}\n" +
$"output : {pVizualizer.StandardOutput}\n" +
$"err : {pVizualizer.StandardError}\n"
);
}
Running a batch file will look at it's own directory and makes all references local, but it won't alter the working directory. (already had my suspicions about changing the work directory but I didn't see a way to call 2 opperations in process.start("cmd.exe");
)
C# program wont start outside visual studio as a .EXE
Based on your comment:
it is in the obj/debug folder of the project
It sounds like you're running the wrong .exe. The obj
folder is used for temporary/misc. files from the build process (see What is obj folder generated for?).
Instead, you want to run the exe within bin\Debug
, if "Debug" is the configuration you're building for. You can see which configuration at the top of VS.
Like others have also mentioned, make sure that Newtonsoft.Json.dll is being copied to that output directory as well. Programs and their dependencies need to be together, generally speaking. Otherwise, your exe will not know where to find the JSON code it needs to function.
99% of the time, you should pretend the obj
directory isn't even there.
If that still isn't pointing you in the right direction, run the app from a command window. Any exception should get printed to it and the window will remain open for you to examine (and this has the benefit of not needing any additional logging or exception handling code to see this error).
For example, I wrote up a bad application that get a NullReferenceException
in a method called Test
that is called from Main
. As you can see, the stacktrace is easily visible, even though my app has crashed (credit to ColinM for bringing this up originally).
Running a .exe application from Windows Forms
You need to use the Process
class:
Process.Start(@"C:\some_location\myapplication.exe");
For arguments:
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = @"C:\some_location\myapplication.exe";
startInfo.Arguments = "header.h";
Process.Start(startInfo);
Obviously you can pull these names/arguments from text boxes.
Related Topics
Run Two Async Tasks in Parallel and Collect Results in .Net 4.5
Why Are C# 3.0 Object Initializer Constructor Parentheses Optional
Get Connection String from App.Config
C# Splitting Strings on '#' Character
Binding a Button's Visibility to a Bool Value in Viewmodel
Best Practices for Exception Management in Java or C#
Is Double Multiplication Broken in .Net
How to Get the Current User in ASP.NET MVC
Execute Task in Background in Wpf Application
Why Doesn't .Net/C# Optimize for Tail-Call Recursion
Entity Framework Change Connection at Runtime
Accessing a Variable from Another Script C#
Inner Join of Datatables in C#
What Guarantees Are There on the Run-Time Complexity (Big-O) of Linq Methods