C#のビルド&実行をバッチファイル化したら途中で止まる問題[Mono]


C#実行環境

  • OS: windows 10 home
  • コンパイラ、動作環境: Mono
  • エディタ: Visual studio code

概要

 競プロ用に、Visual studio codeにC#(mono)のビルド環境を作成した。
 ビルドと実行をコマンドで入力するのが面倒なので、処理をまとめてバッチファイル化してみた。

csrun.bat
csc -out:out.exe test.cs 
mono out.exe

 が、上記の場合1行目のビルドのみが実行され、2行目以降の処理が実行されなかった。

原因と解決法

 ビルド時の実行されるcscコマンドの実体を見てみると、どうやらこれもbatファイル。

 バッチファイルの中で別のバッチファイル(子バッチ)をそのまま呼び出した場合、子バッチ実行後に終了してしまう。
 そのため、実体がbatファイルであるcscコマンドをそのまま実行した場合、それ以後の処理が行われなかった。

 子バッチファイルを呼び出す場合は、「call 子バッチファイル」のように記載する必要がある。
 よって下記のように修正すればよい。

csrun.bat
call csc -out:out.exe test.cs
mono out.exe

余談(VScodeのRunnerと連携するために)

 上記の話も踏まえて、私が実際に使用しているbatファイルを置いておきます。

 Visual studio codeの拡張機能Runnerを入れると、
 特定の言語に対して特定のファイルを実行してくれるショートカットキー(Ctrl+B)が使用できる。
 Runnerと連携時に実行されるbatファイルを下記のように設定してます。

csrun.bat
call csc -out:out.exe %~dpnx1
start /w cmd /c "mono out.exe & pause"
del out.exe

解説
1行目: runnerで呼び出されるバッチはファイル名が第一引数となるので、%1でファイル名を受け取る。
2行目: プログラム実行後に標準入力を受け取るためには、新たにwindowを開く必要があるため、
startコマンドにより新たにwindowを開いている。その後、monoコマンドで実行を行う。
3行目: 実行後は実行ファイルを削除、2行目で/wオプションがあるので、2行目の実行後に削除が行われる。