2010-08-08 73 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(); 
} 
相關問題