12. C# と ASP.NET

前回は Cygwin での C# と ASP.NET の開発について, Java も抱き合わせて駆け足で説明しました。 しかし Java はともかく C# と ASP.NET については, 統合開発環境を前提にした文献が大勢を占めるなか, 明らかに説明不足だったといえるでしょう。

そこで,ここでは具体的な例をとって,もう少していねいに説明します。 処理系の導入,環境変数やエディタの設定は, 前回説明したとおりに済ましてあると仮定します。

12.1 C# コンパイラとデバッガ

例として下記の 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

デバッガ cordbg

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 スタックトレース表示
print 変数値表示
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)
§12.2 につづく

脚注

*1 隠し機能なのか分かりませんが Unix 流の -help も受け付けるようです。同様に,/debug のかわりに -debug としても OK のようです。

目次へ戻る

Copyright (c) 2005 Oki Software Co., Ltd.