どこかに向かうらしい話

迷走エンジニアの放浪記

C# をコマンドラインから

やりたいこと

C#をVisual Stadio2013でサンプルで次々にファイルを作りながら、次々にコンパイルしようとしても、

エラー   1   プログラム 'ConsoleApplication1.exe' で、複数のエントリ ポイントが定義されています: 'Ex01_02.Main(string[])'。エントリ ポイントを含む型を指定するには、/main でコンパイルしてください。

といったエラーが出る。

コンパイルオプションが直接指定されず、プログラムを新しく作るたびに『プロジェクトのプロパティ』 → 『アプリケーション』 → 『スタートアップ オブジェクト』をしないといけないみたいだ。

/main (C# コンパイラ オプション)

とりあえずたるいので、コマンドラインからコンパイル→実行をするほうが楽そうだ。
その辺を支援してくれるバッチファイルを書いて、多少の自動化をしたい。

コマンドラインからコンパイル

C#コンパイラ

コンパイラcsc.exeというファイル名で、たぶんどっかにある。
.net Frameworkが入っている環境ならどっかにあるはず。
だいたいC:\Windows\Microsoft.NET\Framework64\以下にあるはず。
自分の環境ではC:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exeに存在した。

個人個人で分かれる部分とかは個人で補完してください。
とりあえずコンパイルのフルパスをCOMPILER_FILEとします。

コンパイル

ソースコードのフルパスをSOURCE_FILEとすると、コマンドプロンプトより、

> %COMPILER_FILE% %SOURCE_FILE%

とすれば、exeファイルがコマンドプロンプトのカレントディレクトリ上に作成されるので、そのexeを実行すればよい。

ちょっとした自動化の手順

コンパイルコンパイルしたファイルの実行までを楽したい。
とりあえず簡単な感じのものを作ってみた。

バッチファイルの作成

コンパイルと実行をするバッチファイルを以下の通り作成する。

ファイル名を「C_Sharp.bat」とする。

echo off

REM +------------------------------+
REM csc.exe を使用したビルドをするバッチファイル
REM +------------------------------+

REM コンパイラの位置を指定
SET COMPILER="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe"

REM ソースのあるフォルダに移動
REM %~dp1 : 変数からフォルダ名のみを取り出す
cd %~dp1

REM ソースをコンパイルする。
%COMPILER% %1

REM コンパイルしたプログラムを実行
echo ==[ 出力開始 ]==================================================
echo.

REM %~dp1 : 変数からフォルダ名のみを取り出す
REM %~n1  : 変数からファイル名のみを(拡張子は取り除いて)取り出す
%~dp1%~n1.exe

echo.
echo ==[ 出力終了 ]==================================================

REM 入力があるまでプログラムが終了しないようにする。
pause

このバッチファイルを適当なフォルダに置く。
これで、このバッチファイルにC#のソースファイルをドロップしたら、よしなに動作してくれる。

「送る」への登録

『プログラムとファイルの検索』にshell:sendtoと入力し、することで、「SendTo」フォルダを開くことができる。
この「SendTo」フォルダに先ほど作成したバッチファイルのショートカットを配置することで、右クリックの「送る」に登録ができる。

これで、ソースファイルから右クリックで一通りのことが自動化できる。
とりあえずしばらくはこれでイケるか。