Ошибка приложения только при использовании 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();
        }
    }
}
Другие вопросы по тегам