LoginSignup
1

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-08-17

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ファイル。
mono.img

 バッチファイルの中で別のバッチファイル(子バッチ)をそのまま呼び出した場合、子バッチ実行後に終了してしまう。
 そのため、実体が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行目の実行後に削除が行われる。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1