Проблема C # с ProcessStartInfo - PullRequest
       38

Проблема C # с ProcessStartInfo

1 голос
/ 20 октября 2010

Я использую ProcessStartInfo для исправления файла с помощью текстового файла (например, через cmd.exe):

app.exe temp.txt patch.ips

Я написал этот код:

ProcessStartInfo P = new ProcessStartInfo("app.exe");  
P.Arguments = "temp.txt " + _patchpath;  
P.CreateNoWindow = true;  
P.UseShellExecute = false;  
P.RedirectStandardOutput = true;  
Process.Start(P);

app.exe и temp.txt относятся к пути моего приложения (примечание: app.exe - это не имя моего приложения на C #, а просто программа, которую я использую для процесса), но _patchpath - это абсолютный путь, такой как D: \ blah \ file.ips.Проблема в том, что процесс не работает (предполагается, что _patchpath пропатчен файлом temp.txt), если он абсолютный, но работает, если он относится к моему каталогу приложения.Почему это так и как я могу это исправить?

Если мне нужно прояснить ситуацию, пожалуйста, дайте мне знать.

Ответы [ 2 ]

3 голосов
/ 20 октября 2010

Обычный подход к устранению подобных проблем заключается в использовании отладчика.Скопируйте / вставьте это в метод Main () исходного файла для app.exe:

        System.Diagnostics.Debugger.Break();

Как только app.exe запустится, вы получите диалоговое окно, в котором вы можете выбратьотладчик.Оттуда у вас не должно быть особых проблем с выяснением, почему это не работает.

Если у вас нет исходного кода для app.exe, вам придется обдумать это.Использование относительного пути, такого как «app.exe» или «temp.txt», всегда проблематично.Классический режим сбоя использует OpenFileDialog, чтобы позволить пользователю выбрать значение _patchpath.Если для свойства этого диалога RestoreDirectory не установлено значение True, то каталог по умолчанию для вашей программы изменится на путь файла исправления.И ни app.exe, ни temp.txt больше не могут быть четвертыми.

Защитите себя от этого, защитив свои программы:

        var myPath = System.Reflection.Assembly.GetEntryAssembly().Location;
        var homeDir = System.IO.Path.GetDirectoryName(myPath);
        var appPath = System.IO.Path.Combine(homeDir, "app.exe");
        var tempPath = System.IO.Path.Combine(homeDir, "temp.txt");
        ProcessStartInfo P = new ProcessStartInfo(appPath);
        P.WorkingDirectory = homeDir;
        P.Arguments = string.Format("\"{0}\" \"{1}\"", tempPath, _patchpath);
        // etc...
1 голос
/ 20 октября 2010

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

...