7

Windows タスク スケジューラを実行するためのコンソール プログラムを作成しています。私のMain()メソッドの戻り値の型は で、実行結果を示すために終了時に異なる数値を返します。これは、スクリプトで としてintアクセスできます。.BAT%errorlevel%

ただし、VS2015 でデバッグするときは、

return 255;

そして、私は常にVS2015の出力ウィンドウから取得します:

The program '[43560] Foo.vshost.exe' has exited with code 0 (0x0).

ここで、出力ウィンドウにプログラムの終了コードを表示する場合は、Application.Exit(255)それを表示するために実行する必要があります

The program '[24400] Foo.vshost.exe' has exited with code 255 (0xff).

奇妙なのは%errorlevel%CMD.exereturn ステートメントまたはEnvironment.Exit().

だから私の質問は

  1. の戻り値は とMain()多少異なりEnvironment.ExitCodeますか?

  2. Main()VS2015でメソッドの戻り値を簡単に調べる方法は?

  3. コンソール プログラムを終了するときEnvironment.Exit()は、単純な return ステートメントよりも優先されますか? return ステートメントの方が私の好みではより簡潔だからです。

誰かこの裏話を教えてくれませんか?ありがとう。

4

1 に答える 1

7

Main() の戻り値は Environment.ExitCode と多少異なりますか?

いいえ、彼らは同じで、同じ場所に行きます。これは、-1 を返すか、-1 に設定Environment.ExitCodeするだけのコンソール アプリケーションで実験することで確認できます。どちらの方法を使用しても正しく機能し、%ERRORLEVEL%正しく設定されていることがわかります。

VS2015でMain()メソッドの返り値を簡単に調べる方法とは?

まず、何が起こっているように見えるかについて簡単に説明します。デフォルトのプロジェクト設定を使用して作成されたコンソール アプリケーションのスタック トレースを次に示します。

TestApp.exe!TestApp.Program.Main(string[] args)
[Native to Managed Transition]
[Managed to Native Transition]
mscorlib.dll!System.AppDomain.ExecuteAssembly(string assemblyFile, System.Security.Policy.Evidence assemblySecurity, string[] args)
Microsoft.VisualStudio.HostingProcess.Utilities.dll!Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx)
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx)
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state)
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart()

VS ホスト プロセスがあることに注意してください。VS ホスティング プロセスを無効にすると、スタック トレース (同じオプションを使用) は次のようになります。

TestApp.exe!TestApp.Program.Main(string[] args)

参照元ThreadHelper.ThreadStartのの定義を見ると、次のように定義されていることがわかります。

internal void ThreadStart(object obj)

この void 戻り値がプロセスの戻り値として使用されているか、その上の他のメソッドのいずれかが戻り値を消費して飲み込んでいるようです。

プロジェクト構成を変更してホスティング プロセスを無効にすると、次のような出力が得られます。

The program '[7992] TestApp.exe' has exited with code -1 (0xffffffff).

あなたが期待するように。ホスティング プロセスを無効にするには、プロジェクトのプロパティに移動し、[デバッグ] タブで [Visual Studio ホスティング プロセスを有効にする] のチェックを外します。

コンソール プログラムを終了するとき、単純な return ステートメントよりも Environment.Exit() の方が優先されますか? return ステートメントの方が私の好みではより簡潔だからです。

どちらでも構いません。コメントで Jeppe Stig が指摘したように、違いの詳細については、ドキュメントを参照してください。Environment.Exit

于 2016-06-13T12:40:15.067 に答える