C#実行環境
- OS: windows 10 home
- コンパイラ、動作環境: Mono
- エディタ: Visual studio code
概要
競プロ用に、Visual studio codeにC#(mono)のビルド環境を作成した。
ビルドと実行をコマンドで入力するのが面倒なので、処理をまとめてバッチファイル化してみた。
csc -out:out.exe test.cs
mono out.exe
** が、上記の場合1行目のビルドのみが実行され、2行目以降の処理が実行されなかった。**
原因と解決法
ビルド時の実行されるcscコマンドの実体を見てみると、どうやらこれもbatファイル。
バッチファイルの中で別のバッチファイル(子バッチ)をそのまま呼び出した場合、子バッチ実行後に終了してしまう。
そのため、実体がbatファイルであるcscコマンドをそのまま実行した場合、それ以後の処理が行われなかった。
子バッチファイルを呼び出す場合は、**「call 子バッチファイル」**のように記載する必要がある。
よって下記のように修正すればよい。
call csc -out:out.exe test.cs
mono out.exe
余談(VScodeのRunnerと連携するために)
上記の話も踏まえて、私が実際に使用しているbatファイルを置いておきます。
Visual studio codeの拡張機能Runnerを入れると、
特定の言語に対して特定のファイルを実行してくれるショートカットキー(Ctrl+B)が使用できる。
Runnerと連携時に実行される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行目の実行後に削除が行われる。