前回は Cygwin での C# と ASP.NET の開発について, Java も抱き合わせて駆け足で説明しました。 しかし Java はともかく C# と ASP.NET については, 統合開発環境を前提にした文献が大勢を占めるなか, 明らかに説明不足だったといえるでしょう。
そこで,ここでは具体的な例をとって,もう少していねいに説明します。 処理系の導入,環境変数やエディタの設定は, 前回説明したとおりに済ましてあると仮定します。
例として下記の C# プログラムを使います。
これはコマンド行引数として画像ファイルのファイル名を 0 個以上受け取り,
それぞれのファイルについて,
JPEG 320 x 240 ピクセルのサムネイル画像を生成し,
もとのファイル名に .thumb.jpg を付けた名前で保存する,
というものです。
このプログラムを thumbnail.cs というファイル名で保存します。 改行コードは DOS 流儀の "\r\n" でも Unix 流儀の "\n" でもどちらでも OK です。
ここで使われている構文やクラスやメソッドの詳細については, 前回導入した .NET Framework SDK ドキュメントなどを参照してください。 コマンド行引数,配列に対するループ, それから using 文による (ローカル変数の消滅と同時の) 効率のよい即時的な資源解放など, C# プログラミングのエッセンスのいくつかをこのプログラムに入れておきました。
C# コンパイラの基本的な使い方はごく簡単です。
単にソースファイルを与えると,そのまま実行可能な
*.exeファイルが得られます。
下記は,ソースファイルをコンパイルした後,生成された実行可能ファイルを,
二つの画像ファイル Sunset.jpg と aspnet-meadow.bmp
を引数にして実行した例です。
01:~/tmp$ ls Sunset.jpg aspnet-meadow.bmp thumbnail.cs 01:~/tmp$ csc thumbnail.cs Microsoft(R) Visual C# .NET Compiler version 7.10.6001.4 for Microsoft(R) .NET Framework version 1.1.4322 Copyright (C) Microsoft Corporation 2001-2002. All rights reserved. 01:~/tmp$ ls Sunset.jpg aspnet-meadow.bmp thumbnail.cs thumbnail.exe* 01:~/tmp$ ./thumbnail.exe Sunset.jpg aspnet-meadow.bmp ....Sunset.jpg ....aspnet-meadow.bmp 01:~/tmp$ ls Sunset.jpg aspnet-meadow.bmp thumbnail.cs Sunset.jpg.thumb.jpg* aspnet-meadow.bmp.thumb.jpg* thumbnail.exe* 01:~/tmp$
C# コンパイラ csc のオプションは /help で一覧できます。 *1
01:~/tmp$ csc /help
01:~/tmp$ type cordbg cordbg is /cygdrive/c/Program Files/Microsoft.NET/SDK/v1.1/Bin/cordbg 01:~/tmp$
.NET Framework SDK にはコマンド行から使うデバッガとして cordbg が用意されています。 対話的なセッションでプログラムをデバッグできます。 ただし,これをソースコードデバッガとして利用するためには, あらかじめコンパイル時に /debug オプションを与えておく必要があります。
01:~/tmp$ csc /debug thumbnail.cs
cordbg は,コマンド行引数として, 実行ファイル名とその実行ファイルの引数をとります。 実行ファイルの入り口でブレークしますから, そこからブレークポイントを設定して実行を継続させたり, ステップ実行したりします。 基本的な操作コマンドは Cygwin や GNU/Linux で標準の gdb とおおよそ共通です。 さしあたり show コマンドにだけ気をつければ,すぐに使いはじめられるでしょう。 主要な操作コマンドを示します。
| help | ヘルプ。help where で where コマンドの説明など |
| where | スタックトレース表示 |
| 変数値表示 | |
| break | ブレークポイントの設定と表示 |
| cont | 実行継続 |
| next | 次の行まで実行 (関数呼び出しで関数の中に入らない) |
| step | ステップ実行 (関数呼び出しで関数の中に入る) |
| quit | デバッガ終了。exit も可 |
| show | 現在位置のソースを表示 (注意! gdb と異なる) |
使用例を示します。
01:~/tmp$ ls Sunset.jpg aspnet-meadow.bmp thumbnail.cs 01:~/tmp$ csc /debug thumbnail.cs Microsoft(R) Visual C# .NET Compiler version 7.10.6001.4 for Microsoft(R) .NET Framework version 1.1.4322 Copyright (C) Microsoft Corporation 2001-2002. All rights reserved. 01:~/tmp$ cordbg thumbnail.exe Sunset.jpg aspnet-meadow.bmp Microsoft (R) Common Language Runtime Test Debugger Shell Version 1.1.4322.573 Copyright (C) Microsoft Corporation 1998-2002. All rights reserved. (cordbg) run thumbnail.exe Sunset.jpg aspnet-meadow.bmp Process 2452/0x994 created. Warning: couldn't load symbols for c:\windows\microsoft.net\framework\v1.1.4322\ mscorlib.dll [thread 0xd10] Thread created. Warning: couldn't load symbols for c:\windows\assembly\gac\system.drawing\1.0.50 00.0__b03f5f7f11d50a3a\system.drawing.dll 007: foreach (string file_name in args) { (cordbg) show 002: using Drawing = System.Drawing; 003: using Imaging = System.Drawing.Imaging; 004: 005: class ThumbnailMaker { 006: public static void Main(string[] args) { 007:* foreach (string file_name in args) { 008: Console.WriteLine("...." + file_name); 009: using (Drawing.Image image = new Drawing.Bitmap(file_name)) { 010: using (Drawing.Image thumbnail = image.GetThumbnailImage 011: (320, 240, null, IntPtr.Zero)) { 012: string output_file_name = file_name + ".thumb.jpg"; (cordbg) print args args=(0x00c01924) array with dims=[2] args[0] = (0x00c0193c) "Sunset.jpg" args[1] = (0x00c01964) "aspnet-meadow.bmp" (cordbg)
*1
隠し機能なのか分かりませんが Unix 流の -help
も受け付けるようです。同様に,/debug のかわりに
-debug としても OK のようです。