さて、MSCompAssというツールでロハ(「只」という漢字の隠語ですね)でWindowsから頂けるC#コンパイラー(csc.exe)が使えるので、所謂「初歩からのC#」を始めていこうかと考えています。
何を教科書にするか、ネットを漁ったのですが、一つは私が20年以上前に初めてWin32 APIを学習する際にお世話になった
1.「猫でもわかるプログラミング」
とし、一方これでは古いしアカデミック性が高いものも欲しいな、ということで現在ちょっとはまっている
2.「++C++; // 未確認飛行C」
にお願いしようかと思っています。とくに後者(注)はプログラミングのみならず、情報工学、数学、物理等についても書かれており、幅広く「ボケ防止」に役立ちそうです。
注:まだ最初の入り口にいる段階ですが、C++との類似点、相違点(注)がよくわかり、特に相違の方が圧倒的で、気を引き締めて再学習しないとだめだな、と感じております。
注:null 条件演算子、null 免除演算子、checked、unchecked、default、delegate、IEnumerable、foreach、yield、from、with等々山ほどあります-大体C#でcharがあるのですが、ワイド文字やロケールはどう扱っているのだろう?
一方、MSCompAssについてですが、プログラムの説明を長々とやるには恥ずかしい「BatchGoodのオフセット」なので、概略だけサクッと紹介します。詳しくは今後アップしているパッケージのサンプルにソースも入っていますのでそちらをご覧ください。
【リソース】
BatchGoodのダイアログを流用。メニューとツールバーボタンでわかるように「ファイルを開く、ファイルを閉じる(初期化)、プログラムの終了、ソースファイルの編集、コンパイル、Exeファイルの実行、MSCompAssの設定、csc.exeのオプションを含む使い方説明、バージョン情報」となります。
強いて「売り」を挙げれば、ドラッグアンドドロップ、最小サイズ制限付き可変サイズダイアログ(アンカー付きコントロール)ですかね。
また、ダイアログ下部のCCMDEDITクラスのエディットボックスで、エラーメッセージを含むコンパイル結果はもちろん、コンソールプログラムでも出力が見られます。(↑のイメージ参照)出力表示が多い場合はダイアログを大きくしてください。
【MSCompAss.cpp】
モードレスダイアログベースのSkeltonWizard通りのコードです。
【MSCompAss.h】
最小サイズ制限用にメンバー変数にm_Width(ダイアログクライアントエリア幅)、m_Height(ダイアログクライアントエリア高さ)を入れています。
BCCSkeltonからは、ツールバー(CTBARクラス)、ステータスバー(CSBARクラス)、コモンダイアログ(CMNDLGクラス)のみならず、コマンドライン(CARG)クラス、iniファイル作成クラス(CINI)、拡張子チェッククラス(CEXTCHK)、CCMDEDITクラスを使っています。
また、外部変数として、
//---------------
//グローバル変数
//---------------
//システム関係(iniファイル用)
CSTR g_OwnPath; //MSCompAssフォールダーへのパス
CSTR g_IniFile; //MSCompAss.iniファイルのパス・ファイル名
CSTR g_FileName; //ソースファイルのパス・ファイル名
CSTR g_HelpFile; //ヘルプファイルのパス・ファイル名
CSTR g_Csc; //csc.exeのパス・ファイル名
CSTR g_Vbc; //vbc.exeのパス・ファイル名
CSTR g_Edit; //エディターのパス・ファイル名
char* g_Filter; //フィルター用変数
int g_FileType; //拡張子用変数(".cs" - 1、".vb" - 2それ以外 - 0)
//ファイル起動用変数
int g_ByFile; //ドロップファイルがある場合のフラグ
char* g_ptFile = 0; //入力ファイルパス、名へのポインター
を使っています。
【MSCompAssProc.h】
解説すべきポイントは、
(1)iniファイル処理(OnInit()でiniファイルからコンパイラーとエディターの古パスファイル名を読み込みます。また、OnClose()で書き込みます。)
(2)ドラッグアンドドロップ(g_ByFileフラグによる引数付き起動処理とOnDrop()のドラッグアンドドロップ処理)
(3)アンカー付きコントロール(OnInit()でクライアントエリアの初期値を取り、OnSize()関数で変更差分を各コントロール毎に処理します。)
(4)最小サイズ制限付き可変サイズダイアログ(OnMaxMin()関数の定番処理です。)
(5)CCMDEDITのExec()関数処理(注)
でしょうか?
注:このクラスは、プログラムやコマンドを別プロセスを実行し、別スレッドで終了監視してエディットコントロールに結果を出力するクラスです。BatchGoodの時はバッチファイルの実行で起動するプログラム出力をきれいに反映できず、WinExecを敢えて使いましたが、MSCompAssではBCCMakerと同じようにここに出力を表示できました。
最後に「ヘルプ情報」(MSCompAssHelp.chm)ですが、csc.exeとvbc.exeのヘルプファイルを資料1、2で載せていますが、私自身が未だよく分かっていないので詳細は不明(笑)です。
MSCompAssの説明が雑になりましたが、気持ちはもうC#学習(結構大変そうな予感)に移っているので、ご容赦ください。
追補(同日):早速のMSCompAssmの修正です。
MSCompAssにソースファイルをドロップしてコンパイルすると(当たり前ですが)実行ファイルはMSComAssのフォールダーに作られることに気が付き、早速「ヘルプの資料1、2」を調べてC#、VBともに出力ファイルにかかわるオプション"/target:exe"(exeファイルの作成)と"/out:(ファイル名)"が共通であることを確認して、「ソースファイルパスにexeファイルを出力することを規定のオプションにする」ことにしました。(いやなら「オプション」エディットコントロール内のオプション引数を手入力で修正する。)
修正版は本日アップしましたので、DLできるまで少しかかります。なお、それまでにDLされた方はコンパイル時にMSCompAssのフォールダーを確認してください。
なお、↑のイメージも新しくしたMSCompAssのもので、オプションが指定されていることがわかります。
