【问题标题】:Why does Process.Start(ProcessStartInfo) fail?为什么 Process.Start(ProcessStartInfo) 失败?
【发布时间】:2016-07-07 18:56:51
【问题描述】:

我们开发了一个新的 WPF 应用程序,但我在从外部 C# 脚本启动它时遇到了困难。

在使用ProcessStartInfo 对象调用Process.Start(ProcessStartInfo) 方法时,该对象使用WorkingDirectoryFileName 成功初始化,但初始化FileName 属性仅无法启动。

调用任何其他应用程序时情况并非如此。
我的问题 - 启动流程的不同方法是否有不同的逻辑?

查看代码了解更多详情:

 public void LaunchApp(){
/********************************/
/*      This code PASSES        */
/********************************/
var pStartInfoCalc1 = new ProcessStartInfo
    {
        FileName = @"C:\Windows\system32\calc.exe",
    };

Process.Start(pStartInfoCalc1);

/*****************************/
/*  !!!This code FAILS  !!! */
/*****************************/
var pStartInfo1 = new ProcessStartInfo
    {
        FileName = @"C:\Program Files\MyAppFolder\MyApp.exe",
    };

Process.Start(pStartInfo1);

/********************************/
/*      This code PASSES        */
/********************************/
var pStartInfo2 = new ProcessStartInfo
    {
        WorkingDirectory = @"C:\Program Files\MyAppFolder",
        FileName = @"MyApp.exe",
    };

Process.Start(pStartInfo2);

/********************************/
/*      This code PASSES        */
/********************************/
var pStartInfoCalc2 = new ProcessStartInfo
    {
        WorkingDirectory = @"C:\Windows\system32\",
        FileName = @"calc.exe",
    };

Process.Start(pStartInfoCalc2); }`

这是崩溃时的图像:

以下是崩溃截图中的问题签名:

 Problem signature:
  Problem Event Name:   CLR20r3
  Problem Signature 01: MyApp.exe
  Problem Signature 02: 1.0.0.0
  Problem Signature 03: 51ef9fd8
  Problem Signature 04: mscorlib
  Problem Signature 05: 4.0.30319.18052
  Problem Signature 06: 5173bf28
  Problem Signature 07: 266d
  Problem Signature 08: a4
  Problem Signature 09: System.Windows.Markup.XamlParse
  OS Version:   6.1.7601.2.1.0.256.4
  Locale ID:    1033
  Additional Information 1: 1989
  Additional Information 2: 1989c043e2e04efdbf18835c58bb867b
  Additional Information 3: 37d3
  Additional Information 4: 37d31c18f56cf3083b1c45ca83bbb78e

Read our privacy statement online:
  http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0409

If the online privacy statement is not available, please read our privacy statement offline:
  C:\Windows\system32\en-US\erofflps.txt

【问题讨论】:

  • 我认为 Program Files 文件夹默认受操作系统保护。
  • 一个合理的第一个猜测是:有问题的应用程序希望在其工作目录中找到一个特定文件——如果没有,它会因为错误处理不当而崩溃。
  • UseShellExecute的值是多少UseShellExecute为false时,不使用WorkingDirectory属性查找可执行文件
  • 您需要修复代码中的两个错误。错误 #1 使用的文件名只是名称,如 baz.ext,而不是完整路径,如 c:\foo\bar\baz.ext。错误 #2 忘记为 AppDomain.CurrentDomain.UnhandledException 编写事件处理程序,这是必要的,这样您就可以找出程序崩溃的原因。
  • 我说的是您的 WPF 程序,而不是您在此处发布的代码。

标签: c# process


【解决方案1】:

当你不指定工作目录时,新进程会继承你进程的工作目录。即新进程将继承调用Process.Start()的进程的工作目录。

这是启动MyApp 的两次尝试之间的唯一区别。其中之一继承工作目录,其中之一指定它。显然MyApp 不喜欢在初始工作目录作为父进程目录的情况下运行。

为什么会这样,我不能肯定地说。 MyApp 似乎在启动时尝试进行一些 XML 解析。因此,XML 解析可能会读取假定位于工作目录中的文件。但实际上该文件与可执行文件位于同一目录中。

如果是这种情况,那么您需要修改MyApp 来解决问题。您需要根据可执行文件的目录构建绝对路径,而不是使用此 XML 文件的相对路径。

MyApp的启动代码可以到那个目录,像这样:

string ExeDir = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.
    GetExecutingAssembly().Location));

然后您将使用Path.Combine 形成 XML 文件的完整路径。

【讨论】:

  • 感谢您的回复
【解决方案2】:

如果您不提供工作目录,它将使用您当前应用程序的工作目录。

calc 等应用程序没有任何外部文件依赖项,因此它们不关心从何处启动。他们不需要从工作目录读取任何文件。

您的MyApp.exe 很可能需要来自它自己的工作目录的数据,可能是一个配置文件。这个测试通过了,因为它知道查看C:\Program Files\MyAppFolder

/********************************/
/*      This code PASSES        */
/********************************/
var pStartInfo2 = new ProcessStartInfo
{
    WorkingDirectory = @"C:\Program Files\MyAppFolder",
    FileName = @"MyApp.exe",
};

Process.Start(pStartInfo2);

当你没有指定工作目录时,你的应用程序崩溃了,因为它无法加载所需的资源,因为它试图在你启动应用程序的目录中找到它。

如果您知道,最好在启动应用程序时提供工作目录。

如果您可以更新MyApp.exe,它可以使用System.Reflection.Assembly.GetExecutingAssembly().Location 来确定它自己的位置,然后您可以读取与此相关的文件路径,从而无需设置工作目录。

【讨论】:

  • 我不同意您建议的解决方案。依赖于工作目录中的配置文件是问题的根本原因。正确的解决方案是查看执行程序集的目录。
  • @DavidHeffernan 如果已知工作目录,您不同意提供什么?我还建议MyApp.exe 让自己知道它自己的位置,我也看到你也包括了这个。
  • 我不同意的是 MyApp 依赖于工作目录。这不健壮。你原来的版本没有执行程序集的地址。
猜你喜欢
  • 2014-03-17
  • 1970-01-01
  • 2012-04-07
  • 2017-11-14
  • 2010-09-13
相关资源
最近更新 更多