CSCコンパイルバッチ

プログラミングでも何でも、何らかの作業をするときには、環境を整えておくことは大切です。

特に、C#プログラミングの場合には、ウィンドウズパソコン1台あれば新しくソフトウェアをインストールすることなく今すぐ始めることができ ますから、プログラミング作業に慣れていないとなかなか開発環境にまで意識が届かないでしょう。

なので今回は、開発環境を少し整えます。

もちろん、動画解説も用意したので、こちらも参考にしてください。

ダウンロード

今回使用するファイル一式をここをクリックしてダウンロードします。

ZIP形式になっているので、ダウンロードしたら解凍します。

すると、「Step2(Bug)」、「Step2(Normal)」と「Step3」フォルダが現れます。

プログラミング作業

プログラミングに限らず、作業を簡略化することは大切です。

新しくて処理速度の速いパソコンを買ったり、作業内容を間違えないようにメモしておくなど作業効率を上げる方法はいくつかあります。

でも今回は、決まりきった作業はできるだけパソコンに任せて、人間はコーディングに集中できる環境を構築することによりプログラミング作業 効率を引き上げることを目指します。

C#に限らずプログラミング作業というのは、だいたい以下の順序で行われます。

1、作るプログラムを考える

2、コーディング(プログラムを書いたり編集したり)

3、コンパイル(実行ファイルを作る)

4、問題なければ実行、そうでなければ2に戻る

だいたいこんな感じでしょう。

コンパイルエラー

パソコンに最初からインストールされている「csc.exe」を使用してコンパイルする場合、ソースファイルに問題がなければそのまま実行ファイル が作られます。

「Step2(Normal)」フォルダ内には、前回使用したサンプルファイル一式がそのまま入っています。

なので、「Rename.bat」を実行し、その語に「Compile.bat」を実行すれば、前回と同じように「ステップ2」と書かれたウィンドウを表示させる 実行ファイルを作ることができます。

「Compile.bat」の中身は、「C:\Windows\Microsoft.NET\Framework\v3.5\csc.exe Step2.cs」となっています。

何も問題がなければ、これで実行ファイルが作られます。

しかし、ソースファイルに何らかの問題があるとき(コーディングが正しく行われなかった時)などは、当然実行ファイルは作られません。

ためしに、「Step2(Normal)」フォルダ内の「Step2.txt」をわざとエラーが出るように書き換えてコンパイルしてみましょう。

「Step2.txt」を開いて、ウィンドウタイトルを指定している部分「st.Text = "ステップ2";」の末尾にある「;」を削除して上書き保 存して閉じます。

そしてコンパイル作業です、「Rename.bat」を実行し、その語に「Compile.bat」を実行します。

すると、実行ファイルは作られず、何も変化は起こりません。

エラー解決方法

プログラムの記述ミスなどソースファイルに何らかの問題があったとき、実行ファイルが作られないことは分かりました。

そして今回のように短いプログラムであれば、1行ずつチェックするのも簡単でしょう。

しかし、プログラムが大きくなってくるとそうもいきませんよね。

ちょっとしたプログラムでも、千行なんてあっという間ですから、そんなものをいちいちチェックしていられないです。

そんなときは、コンパイラ側にエラーの原因を調べさせることができます。

「Step2(Bug)」フォルダ内の「Compile.bat」を開いてください。

中身は「C:\Windows\Microsoft.NET\Framework\v3.5\csc.exe /bugreport:bugreport.txt Step2.cs」です。

これはコンパイル時に、もしエラーが発生したらその原因を探し出し、テキストファイルのレポートにして出力させる命令です。

C#コンパイラまでのパスと、ソースファイル名との間に、「/bugreport:bugreport.txt」というオプションが指定されています。

これはようするにコンパイルの処理報告を「bugreport.txt」にまとめて報告しなさいというものです。

「Rename.bat」と「Step2.txt」は今までと同じものなので、さっきみたいにわざと問題を起こして、今回はバグを報告させてみましょう。

まずは、「Step2.txt」を開いて、先ほどと同じように「st.Text = "ステップ2";」の「;」を削除し保存して閉じます。

次に「Rename.bat」を実行し、その後に「Compile.bat」を実行します。

今回は「Compile.bat」内にレポート作成命令があるので、新しくウィンドウが開いていろいろ文字が表示されるので、Enterキーを2回押します 。

すると、レポートが作成されウィンドウが閉じて元の画面に戻ります。

ソースファイルに問題があるので実行ファイルはできていませんが、「bugreport.txt」ができているはずです。

「bugreport.txt」の中身を見てみましょう。

ここにはコンパイルエラーの情報以外にも、コンパイラの情報や、ソースファイルの中身など、結構たくさんの情報が書かれています。

なので上から順にみていくと時間がかかるので、一番下まで降りてから、上に読み進めていくのが早いです。

もしくは「### コンパイラの出力」という文字列で検索すると、目的の場所に素早くアクセスできます。

そして問題のエラー報告は以下のようになっています。

「Step2.cs(15,20): error CS1002: ; が必要です。」。

15というのは行数で、20というのは文字目を表しています。

なので、「15行目の20文字目には、「;」が入るんじゃないの?」ということを言っているんです。

これだと探すのも楽ですよね。

コンパイル効率

通常のコンパイルであれば、C#コンパイラに対してソースファイルをわたしてやればいいだけです。

しかし、コーディングミスなどで問題が出たときには実行ファイルは作られません。

そんなときは、「/bugreport:テキストファイル名」をC#コンパイラとソースファイル名の間に挟んであげれば、C#コンパイラが原因を教えてくれ ます。

でもエラーのたびに、命令を変更してコンパイルしなおすのは面倒ですよね。

なのでもちろんエラーがなかったとしても、このレポートを作成しながらコンパイルさせるといったことは可能です。

確かに可能なんですが、問題があってもなくてもコンパイルするたびにEnterキーを2回押すことを求められますし、当然レポートのテキストファ イルも作られます。

なので、それはそれでちょっと面倒ですよね。

CSCコンパイルバッチ

ここまで説明してきましたC#コンパイル作業をもっと簡単かつ、効率的に行うために、C#コンパイル専用のバッチファイル(CSCコンパイルバッチ )を作ってみました。

このCSCコンパイルバッチは、状況により前述しました2種類のコンパイル命令を自動的に使い分けます。

さらに、指定したソースファイルがテキストファイルだった場合には、自動的にC#ソースファイル形式に変換してからコンパイルを行い、作業終 了後にテキストファイルに戻すということまでやってくれます。

「Step3」フォルダ内の「Compile.bat」をメモ帳などのテキストエディタで開いてください。

すると、以下のようなコードが現れます。

@echo off
::-----------------------------------
:: CSCコンパイルバッチ Version 1.0
:: 作者: 木村秀一
:: URL: http://kimurashuuichi.com
::-----------------------------------

SET CompilePath=C:\Windows\Microsoft.NET\Framework\v3.5\csc.exe
SET FileName=Step2
SET ErrorFile=Error.txt
SET ReportFile=BugReport.txt
SET CompilePathErrorMessage=変数「CompilePath」に正しいパスを指定してください。
SET ErrorDeleteErrorMessage=「%ErrorFile%」の削除に失敗しました。
SET ReportDeleteErrorMessage=「%ReportFile%」の削除に失敗しました。
SET ExecutableDeleteErrorMessage=「%FileName%.exe」の削除に失敗しました。
SET SourceFileErrorMessage=「%FileName%.cs」または「%FileName%.txt」がありません。
SET /A RenameFlag=0

:: C#コンパイラのパスが正しくなければ終了

IF NOT EXIST "%CompilePath%" (
echo %CompilePathErrorMessage% > %ErrorFile%
exit
)

:: エラーファイルを削除

IF EXIST "%ErrorFile%" (
erase %ErrorFile%
IF EXIST "%ErrorFile%" (
echo %ErrorDeleteErrorMessage% > %ErrorFile%
exit
)
)

:: バグレポートを削除

IF EXIST "%ReportFile%" (
erase %ReportFile%
IF EXIST "%ReportFile%" (
echo %ReportDeleteErrorMessage% > %ErrorFile%
exit
)
)

:: すでに指定された名前の実行ファイルがあれば削除

IF EXIST "%FileName%.exe" (
erase %FileName%.exe
IF EXIST "%FileName%.exe" (
echo %ExecutableDeleteErrorMessage% > %ErrorFile%
exit
)
)

:: 指定されたファイル名がテキストファイルであればソースファイルに変換

IF NOT EXIST "%FileName%.cs" (
IF EXIST "%FileName%.txt" (
rename %FileName%.txt %FileName%.cs
SET /A RenameFlag=1
)
)

:: この時点で指定された名前のソースファイルがなければ終了

IF NOT EXIST "%FileName%.cs" (
echo %SourceFileErrorMessage% > %ErrorFile%
exit
)

:: コンパイル開始

%CompilePath% %FileName%.cs

:: コンパイル失敗ならば(実行ファイルがなければ)バグレポートを作成

IF NOT EXIST "%FileName%.exe" (
echo on
%CompilePath% /bugreport:%ReportFile% %FileName%.cs
)

:: もともとテキストファイルならばソースファイルをテキストファイルに戻す

IF %RenameFlag% == 1 (
rename %FileName%.cs %FileName%.txt
)

exit

具体的に何をしているのかについては、「::」以降に書かれているコメントと、前述の動画説明を参照してください。

使い方ですが、まずあなたの環境に応じてC#コンパイラまでのパスと、ソースファイル名を指定します。

SET CompilePath=C:\Windows\Microsoft.NET\Framework\v3.5\csc.exe
SET FileName=Step2

どちらも「=」の直後に指定します。

「"」や「'」で囲まないでください。

あなたの環境に応じて書き換えたら、このバッチファイルを実行してみてください。

コンパイルエラーが出たときは「BugReport.txt」を出力し、それ以外のエラーが出たときは「Error.txt」を出力します。

問題なかったときには、もちろん実行ファイルが作られます。