Ошибка приложения только при использовании Process.Start
В нашей системе мы отслеживаем сторонний исполняемый файл, над которым у нас очень мало контроля, давайте назовем его TheServer.exe. Я считаю, что он построен в C++ Builder. Иногда TheServer ведет себя плохо, и нам нужно убить и перезапустить его. Я пишу код C# для автоматизации этого, но когда я запускаю TheServer.exe, используя Process.Start()
Я получаю диалоговое окно с ошибкой от TheServer, в котором говорится "Внешнее исключение E0434F4D".
При запуске TheServer из Проводника или командной строки ошибки не возникает. Я также попытался запустить процесс в режиме отладки в Visual Studio 2010, также без ошибок. Кроме того Process.Start
Я пробовал звонки P/Invoke ShellExecute
а также CreateProcess
с такими же результатами. Есть ли какой-то другой способ начать процесс из.Net?
Код, который я использую сейчас:
const string path = @"C:\Program files\TheServer\TheServer.exe";
ProcessStartInfo psi = new ProcessStartInfo()
{
FileName = path,
WorkingDirectory = Path.GetDirectoryName(path),
UseShellExecute = true, // Tried false as well
};
Process.Start(psi);
Редактировать: Находя этот ответ Хансом Пассантом, я создал очень маленькую программу на C++ в качестве промежуточного звена.
#include <windows.h>
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
ShellExecuteA(NULL, "open", lpCmdLine, "", "", SW_NORMAL);
return 0;
}
Запуск этого из командной строки с помощью Run.exe TheServer.exe
программа запускается без ошибок. Запуск той же командной строки из.Net приводит к тому же диалогу ошибок, что и раньше.
Изменить: Этот вопрос очень похож на мой, но я не использую Xenocode Postbuild, и я считаю, что это была только часть проблемы. Но, как и предполагалось, я попытался пройти через мой код, тогда exe запускается без ошибок. Очень странно.
2 ответа
Ох, как глупо. После многих испытаний и устранения неисправностей я смог выделить проблему. Это никак не связано с Process.Start. Когда мы обнаруживаем, что новый процесс запущен, мы открываем к нему соединение Telnet, чтобы запросить его состояние. Когда это делается слишком рано, отображается сообщение об ошибке. Ну, спасибо, что заставил меня проследить за всем этим.
Вот пусковая установка блокнота, которую я только что развернул. работает нормально
namespace ConsoleApplication5
{
class Program
{
static void Main(string[] args)
{
Process process = new Process();
process.StartInfo.FileName = "notepad";
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
process.Start();
}
}
}