2010-08-08 52 views
15

我知道如何在C#中运行外部应用程序System.Diagnostics.Process.Start(executableName);但是如果我想要运行的应用程序具有Windows无法识别的扩展名作为可执行文件的扩展名。在我的情况下,它是application.bin运行没有扩展名为.exe的外部应用程序

回答

28

关键是要Process.StartInfo.UseShellExecute属性设置为false启动过程之前,例如:

System.Diagnostics.Process p = new System.Diagnostics.Process(); 
p.StartInfo.FileName = @"c:\tmp\test.bin"; 
p.StartInfo.UseShellExecute = false; 
p.Start(); 

这将直接启动过程:而不是通过去了“让我们揣摩的可执行文件指定文件扩展名“的shell逻辑,该文件将被认为是可执行文件本身。

另一种语法来达到相同的结果可能是:

var processStartInfo = new ProcessStartInfo 
{ 
    FileName = @"c:\tmp\test.bin", 
    UseShellExecute = false 
}; 
Process.Start(processStartInfo); 
+1

很好的解释:-) – Chad 2010-08-08 15:35:26

0

要跟踪到MDB的条目:这仅适用于如果你完全限定的文件路径。如果您不必让Windows为文件搜索PATH环境变量,则它会为其搜索的每个文件夹附加一个“.exe”。

不幸的是,这对我正在处理的项目来说很痛苦,因为位置完全依赖于用户文件中设置的PATH。我将不得不手动查找文件并将StartInfo.FileName属性设置为完全限定的路径。

+0

啊......原来有一老一少DOS窍门你可以在你的是:一个时期添加到文件名末尾,Windows将查找文件没有延期。设置StartInfo.FileName =“[appname]”。它会避免在最后添加“.exe”。 – Yelnic 2012-08-21 02:42:58

2

然后从@yelnic继续。尝试使用cmd.exe /C myapp,我发现它非常有用,当我想从Process.Start()中获得更多一点时。

using (Process process = Process.Start("cmd.exe") 
{ 
    // `cmd` variable can contain your executable without an `exe` extension 
    process.Arguments = String.Format("/C \"{0} {1}\"", cmd, String.Join(" ", args)); 
    process.UseShellExecute = false; 
    process.RedirectStandardOutput = true; 
    process.Start(); 
    process.WaitForExit(); 
    output = process.StandardOutput.ReadToEnd(); 
} 
相关问题