为什么Process.Start(ProcessStartInfo)失败?

时间:2013-07-25 11:50:37

标签: c# process

我们开发了一个新的WPF应用程序,我很难从外部C#脚本启动它。

使用Process.Start(ProcessStartInfo)对象调用ProcessStartInfo方法时,WorkingDirectoryFileName成功初始化,init FileName属性无法启动。< / p>

调用任何其他应用程序时不是这种情况 我的问题 - 启动过程的不同方法是否有不同的逻辑?

有关详细信息,请参阅代码:

 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); }`

这是崩溃的图像: enter image description here

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

 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

2 个答案:

答案 0 :(得分:6)

如果未指定工作目录,新进程将继承进程的工作目录。也就是说,新进程将继承调用Process.Start()

的进程的工作目录

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

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

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

MyApp启动代码可以是该目录,如下所示:

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

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

答案 1 :(得分:5)

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

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来确定它自己的位置,那么您可以读取相对于此的文件路径,从而无需设置工作目录。