2016-10-11 3 views
0

Hier ist die Situation. Wir haben eine sehr alte COBOL-Exe, die nur unter Windows XP läuft. Um diese exe auszuführen, haben wir eine virtuelle XP-Maschine eingerichtet. Jede Woche führt der Benutzer eine Reihe von BAT-Dateien aus.C# Windows bildet App mit process.start auf Windows XP Virtuelle Maschine

Ich versuche, eine C# Windows-App zu schreiben, die auf der VM ausgeführt wird und dann die COBOL-Exe ausführen. Der Plan ist, mit Process.Start die EXE aufzurufen. Alles funktioniert gut, wenn MY WINDOWS C# EXE im selben Verzeichnis wie die COBOL-Exe läuft.

Wenn ich die C# exe aus dem Ordner verschieben, bekomme ich einen schlechten Return-Code und der Cobol wird nicht ausgeführt.

Ohne ins Detail zu gehen, möchte ich den COBOL von außerhalb des Ordners ausführen können. Der Grund ist, dass wir mehrere regionale Büros haben und jedes hat seinen eigenen Ordner und eine eigene Kopie der cobol exe in jedem Ordner. Das Ziel ist, dass der Benutzer jedes regionale Büro auswählen kann und dann das C# -Programm jedes Programm in jedem Verzeichnis ausführt.

Zusammenfassend. Wenn ich C# innerhalb des Ordners ausführen, in dem die COBOL-Exe lebt, FUNKTIONIERT IT. ABER, wenn ich C# außerhalb dieses Ordners verschiebe, tut es nicht

Ich hoffe, das alles macht Sinn. Hier sind einige weitere Details:

  1. Erstellt in Visual Studio 2012 als C# Windows-Anwendung
  2. Platform Ziel x86 (I habe auch Jede CPU)
  3. Target Framework .NET Framework 4
  4. COBOL Wenn ich die exe ist Mikrofokus von 1997 (ja, ich weiß. Wir müssen es loszuwerden)
  5. VM Windows XP
  6. ist ändern Notepad es läuft gut
  7. 012.351.
  8. Wenn ich starte starten von Windows und fügen Sie folgendes ein: K: \ AMSapp \ MYTESTFOLDER \ AMSBLD.exe läuft es gut.

  9. C# -Code für Schaltfläche klicken Ereignis (Anmerkung: wenn ich die Dateinamen auf diesen K zu ändern:. \ AMSapp \ MYTESTFOLDER \ AMSBLD.exe i die gleichen Ergebnisse Es ist nicht läuft) Auch die Nachrichtenbox zeigt 255 für einen Rückkehrcode, wenn es nicht funktioniert. Wenn das C# -Programm innerhalb des Cobol-Ordners verschoben wird, wird eine Null zurückgegeben.

    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); 
    
        } 
    } 
    
+1

Try 'process.StartInfo.WorkingDirectory = Path.GetFullPath (process.StartInfo.FileName);' –

+0

klingt eher wie Sie eine Ausführungsberechtigungsproblem haben. Ich würde schauen, auf welches Konto Sie diese unter ausführen und ob dieses Konto beide Anwendungen ausführen darf. Wenn Sie sich über Grenzen hinweg bewegen, müssen Sie sich möglicherweise auch die Identität ansehen, wenn Sie den Anruf tätigen. – Kirby

+0

>>> DIESE GEARBEITET. Zuerst verwendete es nicht den vollständigen Netzwerkpfad. Ich änderte es in K: \ dann den Dateipfad. Auch ich anstelle von Path.GetFullPath (process.StartInfo.FileName) Ich habe nur fest den K: \ Pfad minus den tatsächlichen Dateinamen und es funktionierte. Vielen Dank. –

Antwort

-1

Versuchen Sie, den Prozess Arbeitsverzeichnis auf den gleichen Pfad der COBOL-exe-Datei zu setzen.

process.StartInfo.WorkingDirectory = System.IO.Path.GetFullPath(process.StartInfo.FileName); 
+0

Mein Kommentar war nur ein Hinweis auf OP. Aber ist keine richtige Antwort. Was ist, wenn dieser Code vor dem Festlegen von 'process.StartInfo.FileName' aufgerufen wird? Syntaktisch korrekt, aber logisch falsch. Kopieren Sie also nicht die Codes anderer, schreiben Sie selbst eine richtige. –

-2

Ich denke, sollten Sie ProcessStartInfo.Domain verwenden, um die Domäne zu setzen und nach diesem Pfad innerhalb ProcessStartInfo.FileName exe. Instanz ProcessStartInfo gehen in Process.Start Methode

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

Process.Start(psi); 

Wenn Sie müssen Sie personate Ihr Aufruf Username und Password einstellen. Aber Sie müssen sich daran erinnern, dass Sie sie als Paar bereitstellen müssen. UseShellExecute muss auf false eingestellt sein und WorkingDirectory muss ebenfalls angegeben werden.Mehr: https://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.password(v=vs.110).aspx

+0

Warum abgelehnt? –

+0

Was sollte auf 'ProcessStartInfo.Domain' gesetzt werden? Warum sollten Sie das Problem von OP lösen? Warum beschreibst du es, anstatt ein paar Zeilen kompilierbarer/funktionierender Code zu veröffentlichen? –

+0

@ L.B: Schau dir zuerst deinen Kommentar an. Kein Grund, warum es helfen könnte. Kein Tipp, was es macht. Wenn Sie abstimmten, seien Sie bitte nicht so ein Heuchler. Ich habe keinen Code eingefügt, weil es in der Dokumentation mit EXPLAIN ist. Ich habe genau angegeben, welche Klasse verwendet werden sollte, welche Eigenschaft dieser Klasse verwendet werden sollte und wo die Instanz dieser Klasse übergeben werden soll. –