С# приложение Windows Forms с использованием process.start на виртуальной машине Windows XP

Вот ситуация. У нас есть очень старый исполняемый файл COBOL, который будет работать только в Windows XP. Для запуска этого исполняемого файла мы создали виртуальную машину XP. Каждую неделю пользователь запускает серию BAT-файлов.

Я пытаюсь написать приложение С# для Windows, которое будет работать на виртуальной машине, а затем выполнять COBOL exe. План состоит в том, чтобы использовать Process.Start для вызова EXE. Все работает нормально, ЕСЛИ MY WINDOWS C# EXE запускается в том же каталоге, что и COBOL exe.

Когда я перемещаю исполняемый файл С# из папки, я получаю неверный код возврата, и кобол не выполняется.

Не вдаваясь в подробности, я хочу иметь возможность запускать COBOL из-за пределов папки. Причина в том, что у нас несколько региональных офисов и у каждого своя папка и своя копия cobol exe внутри каждой папки. Цель здесь состоит в том, чтобы позволить пользователю выбрать каждый региональный офис, а затем программа C# выполнит каждую программу в каждом каталоге.

В итоге. Если я запускаю С# внутри папки, где находится исполняемый файл COBOL, ЭТО РАБОТАЕТ. НО, если я перемещаю С# за пределы этой папки, это НЕ

Я надеюсь, что все это имеет смысл. Вот некоторые дополнительные детали:

  1. Создан в Visual Studio 2012 как приложение C# для Windows.
  2. Целевая платформа x86 (я также использовал любой процессор)
  3. Целевая платформа .NET Framework 4
  4. COBOL — это Microfocus из 1997 года (да, я знаю. Нам нужно избавиться от него)
  5. ВМ - это Windows XP
  6. Если я изменю exe на Блокнот, все заработает нормально
  7. Если я запускаю запуск из Windows и вставляю это: K:\AMSapp\MYTESTFOLDER\AMSBLD.exe все работает нормально.

  8. Код C# для события нажатия кнопки (примечание: если я изменю имя файла на это K:\AMSapp\MYTESTFOLDER\AMSBLD.exe, я получу те же результаты. Он не запускается). Также отображается окно сообщения 255 для кода возврата, когда он не работает. Если программа C# перемещается внутри папки cobol, она возвращает ноль.

    private void button1_Click(object sender, EventArgs e)
    {
        try
        {
    
            int exitCode;
    
    
                Process process = new Process();
                process.StartInfo.FileName = @"\\SERVER23021\PRODDATA\AMSapp\MYTESTFOLDER\AMSBLD.exe";
    
    
    
                process.StartInfo.ErrorDialog = true;
    
                process.Start();
                process.WaitForExit(1000 * 60 * 5);    // Wait up to five minutes.
    
                exitCode = process.ExitCode;
                MessageBox.Show("My exit code = " + exitCode.ToString());
    
                MessageBox.Show("my path and file name: " + process.StartInfo.FileName);
    
    
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
    
        }
    }
    

person P. Mennetti    schedule 11.10.2016    source источник
comment
Попробуйте process.StartInfo.WorkingDirectory = Path.GetFullPath(process.StartInfo.FileName);   -  person L.B    schedule 11.10.2016
comment
Похоже, у вас может быть проблема с разрешением на выполнение. Я бы посмотрел, под какой учетной записью вы их запускаете, и разрешено ли этой учетной записи выполнять оба приложения. Кроме того, если вы пересекаете временные границы, вам, возможно, придется обратить внимание на олицетворение при совершении звонка.   -  person Kirby    schedule 11.10.2016
comment
›››ЭТО РАБОТАЛО. Сначала он не использовал полный сетевой путь. Я изменил его на K:\, затем путь к файлу. Также я вместо использования Path.GetFullPath(process.StartInfo.FileName) просто жестко закодировал путь K:\ без фактического имени файла, и это сработало. Большое спасибо.   -  person P. Mennetti    schedule 12.10.2016


Ответы (2)


Попробуйте установить рабочий каталог процесса на тот же путь, что и файл cobol exe.

process.StartInfo.WorkingDirectory = System.IO.Path.GetFullPath(process.StartInfo.FileName);
person aperezfals    schedule 11.10.2016
comment
Мой комментарий был просто намеком на ОП. Но это не правильный ответ. А если этот код вызывается перед установкой process.StartInfo.FileName? Синтатически правильный, но логически неправильный.. Так что не копируйте чужие коды, напишите правильный сами.. - person L.B; 12.10.2016

Я думаю, вы должны использовать ProcessStartInfo.Domain для установки домена и после этого пути к exe в пределах ProcessStartInfo.FileName. Экземпляр перехода ProcessStartInfo в метод Process.Start

ProcessStartInfo psi = new ProcessStartInfo();
psi.Domain = @"SERVER23021";
psi.FileName = @"\PRODDATA\AMSapp\MYTESTFOLDER\AMSBLD.exe";

Process.Start(psi);

Если вам нужно персонифицировать свое призвание, вы можете установить Username и Password. Но вы должны помнить, что вам нужно предоставить их в виде пары. UseShellExecute должно быть установлено на false, а также должно быть указано WorkingDirectory. Дополнительные сведения: https://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.password(v=vs.110).aspx

person Artur Siwiak    schedule 11.10.2016
comment
Что должно быть установлено на ProcessStartInfo.Domain? Почему вы думаете, что это должно решить проблему ОП? Почему вы описываете это вместо публикации нескольких строк компилируемого/работающего кода? - person L.B; 12.10.2016
comment
@LB: Сначала посмотрите на свой комментарий. Нет причин, почему это может помочь. Нет никаких советов, что он делает. Если вы проголосовали против, пожалуйста, не будьте таким лицемером. Я не вставлял код, потому что он есть в документации с объяснением. Я точно указал, какой класс следует использовать, какое свойство следует использовать для этого класса и куда передать экземпляр этого класса. - person Artur Siwiak; 12.10.2016
comment
Look at yours comment first Да, это комментарий, а не ответ. Если вы публикуете что-то в качестве ответа, это должен быть ответ... - person L.B; 12.10.2016
comment
Я не мог комментировать до сих пор. Я смог сделать это только в своем ответе. Вы должны помнить, что новые пользователи не могут комментировать все - person Artur Siwiak; 13.10.2016