【问题标题】:C# windows forms app using process.start on Windows XP Virtual machine在 Windows XP 虚拟机上使用 process.start 的 C# windows 窗体应用程序
【发布时间】:2017-02-20 11:36:25
【问题描述】:

情况是这样的。我们有一个非常旧的 COBOL exe,只能在 Windows XP 上运行。为了运行这个 exe,我们设置了一个虚拟 XP 机器。用户每周都会运行一系列 BAT 文件。

我正在尝试编写一个将在 VM 上运行然后执行 COBOL exe 的 C# Windows 应用程序。计划是使用 Process.Start 来调用 EXE。如果 MY WINDOWS C# EXE 与 COBOL exe 在同一目录中运行,一切正常。

当我将 C# exe 移出文件夹时,我得到一个错误的返回码并且 cobol 没有被执行。

在不涉及很多细节的情况下,我希望能够从文件夹外部运行 COBOL。原因是我们有几个区域办事处,每个办事处都有自己的文件夹和每个文件夹内的 cobol exe 副本。这里的目标是让用户选择每个区域办事处,然后 C# 程序将执行每个目录中的每个程序。

总结。如果我在 COBOL exe 所在的文件夹中运行 C#,它就可以工作。但是,如果我将 C# 移出该文件夹,则不会

我希望这一切都有意义。以下是一些额外的细节:

  1. 在 Visual Studio 2012 中作为 C# Windows 应用程序创建
  2. 平台目标 x86(我也使用过 Any CPU)
  3. 目标框架 .NET Framework 4
  4. COBOL 是 1997 年的 Microfocus(是的,我知道。我们需要摆脱它)
  5. VM 是 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);
    
        }
    }
    

【问题讨论】:

  • 试试process.StartInfo.WorkingDirectory = Path.GetFullPath(process.StartInfo.FileName);
  • 听起来您可能有执行权限问题。我会查看您在哪个帐户下运行这些程序,以及该帐户是否允许执行这两个应用程序。此外,如果您跨越任何时间界限,您可能需要在拨打电话时查看模拟。
  • >>>这行得通。起初它没有使用完整的网络路径。我将其更改为 K:\ 然后是文件路径。此外,我没有使用 Path.GetFullPath(process.StartInfo.FileName) 而是硬编码 K:\ 路径减去实际文件名,并且它有效。非常感谢。

标签: c# windows process.start microfocus


【解决方案1】:

尝试将进程工作目录设置为cobol exe文件的相同路径。

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

【讨论】:

  • 我的评论只是为了给 OP 一个提示。但不是一个正确的答案。如果在设置process.StartInfo.FileName 之前调用此代码怎么办?语法正确但逻辑错误..所以不要复制别人的代码,自己写一个正确的..
【解决方案2】:

我认为,您应该使用ProcessStartInfo.Domain 设置域,然后在ProcessStartInfo.FileName 中设置exe 的路径。 ProcessStartInfo 的实例传入Process.Start 方法

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

Process.Start(psi);

如果您需要模拟您的呼叫,您可以设置UsernamePassword。但您必须记住,您需要成对提供它们。 UseShellExecute 必须设置为 false 并且还必须提供 WorkingDirectory。更多:https://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.password(v=vs.110).aspx

【讨论】:

  • ProcessStartInfo.Domain 应该设置什么?为什么你认为它应该解决 OP 的问题?为什么要描述它而不是发布几行可编译/工作代码?
  • @L.B:先看看你的评论。没有理由可能会有所帮助。没有任何提示它的作用。如果你投了反对票,请不要这么虚伪。我没有粘贴任何代码,因为它在带有解释的文档中。我准确地给出了应该使用什么类,应该使用这个类的什么属性以及在哪里传递该类的实例
  • Look at yours comment first 是的,这是评论,不是答案。如果您发布某些内容作为答案,它应该是 answer ...
  • 直到现在我才能发表评论。我只能在我的回应中这样做。您应该记住,新用户不能评论所有内容
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多