2009-08-06 101 views
6

我創建可以運行的GUI,也可以通過命令行來操作一個C#WinForms項目。目前,我可以處理命令行輸入和參數。我可以從命令行運行程序,我可以使用該程序來處理參數。但是Console.Writeline()完全沒有。任何線索爲什麼會這樣?Console.Writeline()不工作

+3

在這裏看到:http://stackoverflow.com/questions/807998/how-do-i-create-ac-app-that-decides-itself-whether-to-show-as- a-console-or-wind – Thorarin 2009-08-06 19:30:06

+0

您的意思是在命令行模式下運行程序時調用Console.WriteLine似乎默默地失敗了嗎? – 2009-08-06 19:30:45

+0

可以嘗試下面簡單 - 靜態無效的主要(字串[] args){ 的foreach (在args串ARG) { Console.WriteLine(ARG); } Console.ReadLine(); } 它工作嗎? – Mutant 2009-08-06 19:31:46

回答

6

在大多數情況下,看到answer here。不過,我想指出是否存在FreeConsole() API調用,它允許您正常關閉控制檯。

[DllImport("kernel32.dll")] 
static extern int FreeConsole() 

有一兩件事我想請注意:您可能會看到出現在您的控制檯輸出的前一個命令提示符的一些怪事,如果你從現有的控制檯啓動並連接到與AttachConsole(如反對AllocConsole)。

這是一個很難解決的時間問題。如果這是一個問題,請將您的應用程序設置爲像其他人所建議的控制檯應用程序。直到應用程序關閉時,纔會出現無命令提示符的效果,但如果您打開一個winform,則可能不是您想要的。

針對您的評論:它要麼AttachConsoleAllocConsole。我鏈接的示例首先嚐試附加到現有控制檯。如果失敗(很可能是因爲它不存在),它會改爲創建一個新的控制檯窗口。

如果你找到一種方法,有兩全其美的命令行的行爲和GUI交互模式而言,請讓我知道。我沒有深入搜索解決方案,但我有一些小型應用程序會受益。順便說一句:如果你打算在你的命令行上使用管道(例如將輸出重定向到一個文件),那麼不幸的是,這種方式不行。

+0

此解決方案效果很好。幸運的是,我不需要管道。謝謝!! – novacara 2009-08-06 20:00:10

0

它作爲你的項目的屬性應用程序選項卡上配置它與項目類型做,你有3種選擇:

  • 控制檯應用程序
  • Windows應用程序
  • 類庫

如果使用Windows應用程序工作,但是,你也可以處理命令行參數,因爲這些都是在主函數接收。

0

項目必須設置爲編譯到一個控制檯應用程序控制臺功能工作。另一方面,它將始終有一個控制檯窗口,即使以GUI的形式運行。我不知道這方面的解決方法(但如果有的話可能會有興趣聽到)。

3

這是因爲你已經寫了一個winforms應用程序 - 這意味着System.Console.Out(即標準輸出流)被設置爲Stream.Null。這意味着任何對該流的調用都將失敗。

您可以在命令行輸入處理,因爲他們來自不同的流。故事的寓意是你可以擁有一個winforms應用程序或一個命令行應用程序,但不能同時存在。

+0

是的,排序... Windows API調用救援:) – Thorarin 2009-08-06 19:55:40

5

您可以使用以下DllImports啓用Windows窗體應用程序控制臺:

[DllImport("kernel32.dll")] 
    static extern bool AttachConsole(int dwProcessId); 
    private const int ATTACH_PARENT_PROCESS = -1; 

    [DllImport("kernel32.dll", SetLastError = true)] 
    internal static extern int FreeConsole(); 

然後,您可以使用啓用控制檯:

AttachConsole(ATTACH_PARENT_PROCESS); 

,並且可以使用禁用它:

 FreeConsole(); 
2

我在一個後臺線程中做了這個,後臺線程正在運行一個動態加載的函數DLL(反射)

AllocConsole(); 
IntPtr stdHandle = GetStdHandle(STD_OUTPUT_HANDLE); 

StreamWriter standardOutput = new StreamWriter(Console.OpenStandardOutput()); 
standardOutput.AutoFlush = true; 
Console.SetOut(standardOutput); 
// 
//Console writing here 
// 
FreeConsole(); 

我的控制檯是空白的,直到我說的Console.SetOut(),我不知道你需要調用GetStdHandle()

+0

謝謝,我有一個工作了一段時間的AllocConsole,突然間它不再有了。添加Console.SetOut()做了詭計! – 2015-07-20 18:21:41

1

您可能需要更改應用程序類型。這可以通過通過在GUI應用程序屬性或者改變它來完成(如answer從ConsultUtah解釋),也可以編輯.csproj文件

Winform的/ WPF:

<OutputType>WinExe</OutputType> 

控制檯( 這是你需要什麼console.writeline()是工作):

<OutputType>Exe</OutputType> 

DLL(包括Web應用A NS):

<OutputType>Library</OutputType> 
相關問題