【发布时间】:2012-09-05 18:04:24
【问题描述】:
我有以下简单的 C# 应用程序,它只是尝试启动“jconsole.exe”,它在我的机器上位于 C:\Programs\jdk16\bin。
using System;
using System.Diagnostics;
namespace dnet {
public class dnet {
static void Main( string[] args ) {
try {
Process.Start("jconsole.exe");
Console.WriteLine("Success!");
} catch (Exception e) {
Console.WriteLine("{0} Exception caught.", e);
}
}
}
}
如果我的 PATH 环境变量设置为
c:\windows;c:\windows\sytem32;c:\programs\jdk16\bin
完美运行。但是,如果 PATH 环境变量设置为
c:\windows;c:\windows\sytem32;c:\\programs\jdk16\bin
(注意 "c:" 和 "programs" 之间的两个反斜杠),它会因 win32 异常而失败。
System.ComponentModel.Win32Exception (0x80004005): The system cannot find the file specified
at System.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo startInfo)
at System.Diagnostics.Process.Start(ProcessStartInfo startInfo)
at dnet.dnet.Main(String[] args)
有趣的是,在我运行 .NET 程序并获得异常的同一命令提示符下,我只需键入“jconsole.exe”,程序就会启动。 Windows 似乎可以轻松地在 PATH 中找到带有双反斜杠的可执行文件,但 Process.Start() 可以。
为什么 PATH 中的额外反斜杠会导致问题,我该如何解决这个问题?我不知道我要调用的可执行文件在运行时会位于何处,所以我宁愿依赖 PATH 变量。
【问题讨论】:
-
启动 EXE 有两种方式,您正在测试两种方式。您的应用程序使用 ShellExecuteEx(),命令行解释器使用 CreateProcess()。您可以使用 ProcessStartInfo.UseShellExecute 属性。不必担心他们如何以不同方式解释 PATH 环境变量,您知道如何解决问题。
标签: c# path process.start