雑記
Visual Studio.NET (2002) Visual Studio.NET 2003 Visual Studio 2005 Visual Studio 2008 Visual Studio 2010 Visual Studio 2012 Visual Studio 2013 Visual Studio 2015 Visual Studio 2017 Visual Studio 2019

Console.WriteLine や Debug.WriteLineはどこに出力されるか?

この記事が対象とする製品・バージョン (バージョンの確認方法)

VS2019 Visual Studio 2019 対象です。
VS2017 Visual Studio 2017 対象です。
VS2015 Visual Studio 2015 対象です。
VS2013 Visual Studio 2013 対象です。
VS2012 Visual Studio 2012 対象です。
VS2010 Visual Studio 2010 対象です。
VS2008 Visual Studio 2008 対象です。
VS2005 Visual Studio 2005 対象です。
VS.NET 2003 Visual Studio 2003 対象です。
VS.NET 2002 Visual Studio (2002) 対象です。
 

1.Console.WriteLine と Debug.WriteLine の出力先

この表はデフォルトの場合です。プログラムや設定で出力先や出力有無を変更している場合は、この表とは異なる結果になります。

ここでは代表してWriteLineメソッドを取り上げていますが、出力先に関してはWriteメソッドやPrintメソッドなどその他の出力メソッドでも同じです。

Debug.WriteLineはDebugビルドを実行している場合でないと表示されません。

DebugビルドとReleaseビルドの切り替え

なお、「出力ウィンドウは」は[表示]メニューから[出力]で表示できます。

  Console.WriteLineの出力先 Debug.WriteLineの出力先
コンソールアプリケーションの場合 コンソールウィンドウ
出力ウィンドウの 出力元 デバッグ
Windowsフォームアプリケーション
/WPFアプリケーションの場合
出力ウィンドウの 出力元 デバッグ

※exeを直接実行している場合どこにも出力されません。(参考1)
出力ウィンドウの 出力元 デバッグ
Webアプリケーションの場合 どこにも出力されません。(脚注1)
※WebアプリケーションではConsole.WriteLineを使用しないでください。(参考2)
出力ウィンドウの 出力元 デバッグ

脚注1:Webサーバーの標準出力を見る方法がある場合、Webサーバーの標準出力として出力されているかもしれません。たとえば、コマンドからWebサーバーを起動したり、Webサーバーの標準出力がファイルにリダイレクトされている場合。

 

この記事を作成するにあたり私が実際に試した環境

2.プログラム例

C#の場合

 
Console.WriteLine("TEST");
System.Diagnostics.Debug.WriteLine("DEBUG");

Visual Basicの場合

 
Console.WriteLine("TEST")
Debug.WriteLine("DEBUG")

古いバージョンのVBではDebug.WriteLineは System.Diagnostics.Debug.WriteLineと書く必要があるようです。(2002ではその必要がありました。2010ではその必要はありませんでした。あくまでの既定値で使用する場合の話です。)

 

3.仕様

.NETの仕様ではConsoleクラスはコンソールアプリケーション向けの標準出力・標準入力・エラー出力を表しています(参考3)。この3つの入出力はOSが用意している入出力のチャンネルのことです。

Visual Studioがアプリケーションを実行するときにこのチャンネルをどのように割り当てるかは.NETの仕様ではなくVisual Studioの仕様です。残念ながらVisual Studio自体の仕様書は公開されておらず具体的にどこに割り当てられるのか仕様から特定することはできません。

 

4.プログラムや設定での変更

私が知っている項目を挙げます。他にもあるかもしれません。Visual Studio等のバージョンによっても異なるかもしれません。この内容はVisual Studio 2019で確認しました。

参考

参考1 MSReference

Calls to methods such as Console.Write and Console.WriteLine have no effect in GUI applications.

私訳:Console.WriteやConsole.WriteLineのようなメソッドの呼び出しはGUIアプリケーションではなんの効果もありません。

 

参考2 MSReference

Do not use the Console class to display output in unattended applications, such as server applications.

私訳:サーバーアプリケーションのように自動で実行されているアプリケーションでは出力を表示するためにConsoleクラスを使用しないでください。

 

参考3 MSReference

Represents the standard input, output, and error streams for console applications.

私訳:コンソールアプリケーション向けの標準入力、標準出力、エラーストリームを表します。

 

 

出典

出典1 MSReference

https://docs.microsoft.com/en-us/dotnet/api/system.console