【问题标题】:System.Diagnostics.Process can't start processSystem.Diagnostics.Process 无法启动进程
【发布时间】:2013-10-09 09:42:37
【问题描述】:

我正在使用 .net framework 4.0 Client Profile 在 VS2010 上创建服务。目标机器是 Windows Server 2003 64 位。该服务移动一些文件,然后使用 System.Diagnostics.Process 执行一个进程。问题是,即使任务管理器显示一个进程正在启动,可执行文件也永远不会做任何事情。示例代码:

        private void imprimir(string nombreImpresora, int copias, string nombreArchivo)
    {
        try
        {
            string copiasSumatra = "1,";
            for (int i = 1; i < copias; i++)
            {
                copiasSumatra += "1,";
            }

            string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
            string comando = String.Format("-print-to \"{0}\" \"{1}\" -print-settings \"{2}odd,fit\" -silent", nombreImpresora, nombreArchivo, copiasSumatra);
            string filename = '"' + Path.Combine(path, "SumatraPDF.exe") + '"';
            System.Diagnostics.Process proc = new System.Diagnostics.Process();
            proc.StartInfo.WorkingDirectory = path;
            proc.StartInfo.FileName = filename;
            proc.StartInfo.Arguments = comando;
            proc.StartInfo.RedirectStandardError = false;
            proc.StartInfo.RedirectStandardOutput = false;
            proc.StartInfo.UseShellExecute = true;
            proc.StartInfo.ErrorDialog = false;
            proc.Start();
            proc.WaitForExit();
            lc.writeToLog("Instruction executed. Exit code: " + proc.ExitCode);
        }
        catch (Exception ex)
        {
            lc.writeToLog(ex.Message + " " + ex.StackTrace);
        }
    }

如果我在我的开发机器(Windows 8 pro)或另一台测试服务器(Windows Server 2003 32 位)上执行它,它会达到预期的效果。如果我在 WS2003 64 位服务器上运行它,它什么也不做。

我已经调试了很多次,看看它是否会产生一些我遗漏的错误,但没有任何反应。 “lc.writeToLog”方法将文本打印到文件中。我用它来记录执行的每一行,但没有抛出错误。使用该方法,我得出的结论是它通过了“proc.WaitForExit()”指令,所以我认为它会按照我的编程进行操作,但没有任何反应。

我已经运行了相同的指令,但将用户、密码和域传递给它,结果是相同的。还尝试捕获标准错误和输出,但它什么都不包含。

可能是什么问题?

【问题讨论】:

  • 运行另一个进程通常会在出现问题时给您带来非常糟糕的诊断。尤其是当您也不检查 Process.ExitCode 时,这是您可以看到出现问题的唯一方法。不设置 StartInfo.WorkingDirectory 也是一个很大的错误,该文件实际上可以创建但您无法找到它,因为您不知道要查看哪个目录。避免使用 .bat 文件,他们可以做的任何事情都可以在 C# 中也是如此。
  • 我已经更新了我的代码以使用您的建议,如您所见。现在它显示了我正在尝试执行的实际代码(使用 sumatra pdf 打印 pdf)。进程退出代码为 2。
  • 这通常意味着“找不到文件”,当然这是一个非常常见的错误。由于打印机不存在或文件不存在,nombreArchivo 必须是文件的完整路径。

标签: c# windows windows-server-2003


【解决方案1】:

这是与服务器相关的问题。将应用程序部署到生产服务器后,问题就消失了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-24
    • 2018-12-11
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多