Запуск программы на C # из другой программы на C #

2

Благодаря тому, что у меня есть знания по запуску приложений, я знаю, что у вас есть несколько способов запуска приложений в С#.NET, но я сталкиваюсь с проблемой, которая возникает при попытке запустить приложение SDL2.

Я попытался сделать следующее, используя класс Process для:

  • Запустите .exe файл сборки.
  • Запустите приложение, используя " cmd.exe/K " или " cmd.exe/c ", затем " exec ", " call " или " start ", а затем " {path to file} " или " {path to batch file to launch the application} ". Запуск приложения через командный файл и CMD работает нормально. Но всякий раз, когда я пытаюсь даже запустить приложение (даже в новом экземпляре Command-Prompt, запущенном из параметров cmd.exe/? Start cmd.exe?), Это не дает результата.

Что я могу наблюдать, так это то, что приложение пытается открыть. Требуется вечность, чтобы перейти в оконный режим (запуск 3D-среды). По истечении времени ожидания он либо визуализирует пару кадров пустого окна перед закрытием, либо закрывает сразу после открытия окна.

Итак, мой вопрос: кто-нибудь успешно создал приложение запуска для приложения SDL, написанного на С#.NET? Или знает способ отладки этого поведения? Потому что, к сожалению, приложение не отправляет сообщение об ошибке, и поскольку SDL безопасно закрывает приложение, я также не могу наблюдать сбой.

Редактировать # 1

Я не делаю ничего особенного с параметрами, поскольку их не должно быть. У меня уже есть еще одна функция, которая запускает обычное приложение на С#, так как моей программе запуска требуется открыть 2 программы. 1 приложение SLD, 1 COM: управляющее приложение VBA. Дано:

string audioSpectrumProgram = "AudioSpectrum.exe";
string audioSpectrumBatchProgram = "AudioSpectrum.bat";

private void BtnLaunchPPTApp_OnClick()
{
    //Powerpoint controlling application
    pVBAApp = Process.Start(presenterProgram, $"\"{this.path}\" {this.audioFormatParams[0]} {((this.ckboxGenerate.Checked) ? "--create" : "")} lang={this.languageCodesParams[this.cboxLanguage.SelectedIndex]}");
}

Способ 1:

private void BtnLaunchSDLApp_OnClick()
{
    pVizualizer = Process.Start(audioSpectrumProgram); //file launched from local path (is correct)
}

Способ 2:

pVizualizer = Process.Start(audioSpectrumBatchProgram); //file launched from local path (is correct)

Способ 3:

ProcessStartInfo info = new ProcessStartInfo("cmd.exe");
FileInfo spectrumFileInfo = new FileInfo(audioSpectrumProgram);
if (spectrumFileInfo.Exists)
   info.Arguments = $"/c \"{spectrumFileInfo.FullName}\"";
pVizualizer = Process.Start(info);

Метод 4: основан на сенарио метода 3. Вам не нужно анализировать аргументы, используя ProcessStartInfo.

pVizualizer = Process.Start($"cmd.exe /K call \"{spectrumFileInfo.FullName}\"") //to observe what happens to the application

Редактировать № 2

Не зависит от изменения UseShellExecute на true или false

private void btnOpenVisualizer_Click(object sender, EventArgs e)
    {
        FileInfo spectrumFileInfo = new FileInfo(audioSpectrumProgram);
        ProcessStartInfo info = new ProcessStartInfo(spectrumFileInfo.FullName);
        info.UseShellExecute = true;
        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"
            );
    }
  • 0
    Привет @Ryan и добро пожаловать в StackOverflow. Я думаю, что может быть что-то не так с кодом, который используется для запуска процесса. Не могли бы вы поделиться этим кодом, чтобы мы могли вам помочь?
  • 0
    Пожалуйста, добавьте код, который вы используете и не работаете. Я подозреваю, что вы передаете параметры неправильно.
Показать ещё 5 комментариев
Теги:
sdl
sdl-2

2 ответа

1
Лучший ответ

Хорошо. Для справки в будущем: путь к файлам может быть правильным, и все может быть в порядке, но если вы используете DLL для импорта. Измените рабочий каталог.

Проект запустится, библиотеки "иногда" могут быть найдены, но могут вызвать странную неизвестную ошибку, подобную этой. Таким образом, наиболее оптимальный способ запуска другого экземпляра С# с SDL или любым другим видом библиотеки:

    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" 
            );
    }

Запуск командного файла будет смотреть на его собственный каталог и делает все ссылки локальными, но это не изменит рабочий каталог. (у меня уже были подозрения об изменении рабочего каталога, но я не нашел способа вызвать 2 операции в process.start("cmd.exe");)

2

Общий способ анализа проблем при запуске - это использование SysInternals Process Monitor.

Запишите приложение, которое не запускается должным образом. Используйте фильтр для вашего приложения. Затем просмотрите все элементы, которые не имеют SUCCESS в столбце результатов. Как правило, вы хотите сделать это снизу вверх, поскольку последняя ошибка останавливает загрузку вашего приложения.

Таким образом, вы найдете общие проблемы запуска, такие как:

  • недостающие библиотеки DLL или другие зависимости
  • старые библиотеки DLL или библиотеки DLL, загруженные из неправильного расположения (например, зарегистрированные компоненты COM)
  • неправильный рабочий каталог, например доступ к несуществующим файлам конфигурации

Ещё вопросы

Сообщество Overcoder
Наверх
Меню