Как запустить исполняемый файл в C # с конкретными рекомендациями

В настоящее время я портирую запуск c ++ exe на c #. Я в состоянии прочитать и понять код C ++, но я изо всех сил пытаюсь найти эквивалент C #. Я считаю, что оригинальный код запускает исполняемый файл с помощью командной строки.

Я думаю, что было бы лучше отобразить код, который я портирую, так что вот оно:

  // This is basically running an exe to compile a file that I create
short rtncod;

int GPDataAge = FileAge(SelectedPath + GPDATA); //Checks age of GPDATA if it exists

STARTUPINFO si;         // Startup information structure
PROCESS_INFORMATION pi; // Process information structure

memset(&si, 0, sizeof(STARTUPINFO)); // Initializes STARTUPINFO to 0
si.cb = sizeof(STARTUPINFO); // Set the size of STARTUPINFO struct
AnsiString CmdLine = Config->ReadString("Configuration","CRTVSM","CRTVSM.EXE . -a"); // Windows version requires path

rtncod = (short)CreateProcess(
NULL,   // pointer to name of executable module
CmdLine.c_str(), // pointer to command line string
NULL,   // pointer to process security attributes
NULL,   // pointer to thread security attributes
FALSE,   // handle inheritance flag
CREATE_NEW_CONSOLE, // creation flags
NULL,   // pointer to new environment block
NULL,   // pointer to current directory name
&si,    // pointer to STARTUPINFO
&pi);   // pointer to PROCESS_INFORMATION
if (!rtncod) /*If rtncod was returned successful**/ {
int LastError = GetLastError();
if (LastError == 87 /* Lookup 87 error **/ && AnsiString(SelectedPath + GPDATA).Length() > 99)
ShowMessage("CRTASM could not run due to extremely long path name.  Please map or move the folder to shorten the path");
else
ShowMessage("Could not compile VSMInfo.dat =>" + IntToStr(LastError));
}
else /* If successful **/ {
unsigned long ExitCode;
// CartTools will 'lock up' while waiting for CRTASM
do {
rtncod = GetExitCodeProcess(pi.hProcess,&ExitCode);
} while (rtncod && ExitCode == STILL_ACTIVE);
if (rtncod == 0) {
rtncod = GetLastError();
ShowMessage("Could not watch CRTVSM compile VSMInfo.dat =>" + IntToStr(GetLastError()));
}
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}

if (GPDataAge == FileAge(SelectedPath + GPDATA)) // date/time didn't change!
Application->MessageBox(AnsiString("Output blocking file (" + SelectedPath + GPDATA") failed to be updated.  Check operation of CRTVSM.EXE before using "GPDATA" with SAM/CMS!").c_str(),"CRTVSM Error",MB_OK|MB_ICONHAND);

Все это может не относиться к делу, и вы можете не знать, откуда берутся мои личные элементы, но это нормально, так как меня интересуют только элементы процесса MICROSOFT (такие как CreateProcess а также STARTUPINFO).

До сих пор я смотрел на Process.Start метод, предусмотренный в этот вопрос, но не думайте, что это позволяет мне проходить те же процессы, что и перечисленные выше.

Мой вопрос заключается в том, какой класс или методы я могу использовать, чтобы настроить запуск exe-файла аналогично запуску, который выполняется в коде c ++ выше?

ОБНОВИТЬ: В настоящее время у меня есть исполняемый файл, расположенный в папке, которую я создал в решении моей программы. Для запуска исполняемого файла я использую ProcessStartInfo учебный класс.

//The folder that the exe is located in is called "Executables"ProcessStartInfo startInfo = new ProcessStartInfo("Executables\\MYEXECUTABLE.EXE");
Process.Start(startInfo);

Всякий раз, когда я запускаю вышеуказанные строки кода, я получаю Win32Exception was unhandled, и он говорит, что «Система не может найти указанный файл».

1

Решение

Код C ++, по сути, не использует команду ‘prompt’, а запускает процесс, указывая путь к исполняемому файлу. CreateProcess, Вы можете сделать то же самое в C # с помощью Process учебный класс. конфигурировать Process.StartInfo и позвонить Start метод.

Что касается запуска исполняемого файла с определенным путем: если вы не укажете полный путь, то вы находитесь во власти рабочего каталога. Если exe-файл — это тот же каталог, что и исполняемый файл, или его подкаталог, вы можете создать путь следующим образом:

string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Executables\MYEXECUTABLE.EXE");
ProcessStartInfo startInfo = new ProcessStartInfo(path);
Process.Start(startInfo);
1

Другие решения

В дополнение к jltrem, примером Process.Start является:
http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo(v=vs.110).aspx

using System;
using System.Diagnostics;
using System.ComponentModel;

namespace MyProcessSample
{
class MyProcess
{
// Opens the Internet Explorer application.
void OpenApplication(string myFavoritesPath)
{
// Start Internet Explorer. Defaults to the home page.
Process.Start("IExplore.exe");

// Display the contents of the favorites folder in the browser.
Process.Start(myFavoritesPath);
}

// Opens urls and .html documents using Internet Explorer.
void OpenWithArguments()
{
// url's are not considered documents. They can only be opened
// by passing them as arguments.
Process.Start("IExplore.exe", "www.northwindtraders.com");

// Start a Web page using a browser associated with .html and .asp files.
Process.Start("IExplore.exe", "C:\\myPath\\myFile.htm");
Process.Start("IExplore.exe", "C:\\myPath\\myFile.asp");
}

// Uses the ProcessStartInfo class to start new processes,
// both in a minimized mode.
void OpenWithStartInfo()
{
ProcessStartInfo startInfo = new ProcessStartInfo("IExplore.exe");
startInfo.WindowStyle = ProcessWindowStyle.Minimized;

Process.Start(startInfo);

startInfo.Arguments = "www.northwindtraders.com";

Process.Start(startInfo);
}

static void Main()
{
// Get the path that stores favorite links.
string myFavoritesPath =
Environment.GetFolderPath(Environment.SpecialFolder.Favorites);

MyProcess myProcess = new MyProcess();

myProcess.OpenApplication(myFavoritesPath);
myProcess.OpenWithArguments();
myProcess.OpenWithStartInfo();
}
}
}
0

По вопросам рекламы [email protected]